I developed some application 'till now. Now I'm writing a new one and in this project I want to keep the code very clean, so it's very easy to find the methods.
I want to start with the UIViewControllers whose view have a UITableView as subview. I wish to have a file with the name DetailViewController
for all functions which belong directly to it. Another file with the name DetailViewController+Protocols
should contain a category of the class above and all these delegate methods of UITableView.
Is it possible to do something like this? I want to keep my code clean and split it into multiple files.
EDIT
DetailViewController.h
@interface DetailViewController : UIViewController
... Some Properties
... Some Methods
@end
DetailViewController.m
#import "DetailViewController.h"
@implementation DetailViewController
... Some Synthesizes
... Some Methods
@end
DetailViewController+Protocols.h
@interface DetailViewController (Protocols) <UITableViewDelegate, UITableViewDataSource>
@end
DetailViewController+Protocols.m
@implementation DetailViewController (Protocols)
- (NSINteger)numberOfSections
{
return ...;
}
- (NSInteger)numberOfRowsInSection:(NSInteger)section
{
if (section == 0)
return ...;
return ...;
}
...
@end
But then Xcode shows a warning that some of the delegate methods are not implemented in DetailViewController. I also tried it with importing the DetailViewController+Protocols.h in the DetailViewController.h. No changing.
Then I tried it with ignoring the warnings and see: It worked! But why? Shouldn't it work without these warnings?
Yes it is. The only thing to keep in mind with categories is that you cannot
@synthesize
properties in them. Adding ivars in categories is more difficult as well.See this for more info on that.
You don't have to create an entirely separate named protocol in a different file if you're only using it against one class. In fact, you probably shouldn't because it's just confusing.
If you want to keep your primary class' .h file clean, just move this:
into your primary .m file above the @implementation
I don't see why you wouldn't want to declare in your .h that your primary class implements the tableview delegate and datasource protocols, though. They're descriptive.