Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Put delegate methods into a category

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?

like image 269
Paul Warkentin Avatar asked Nov 04 '11 20:11

Paul Warkentin


2 Answers

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:

@interface DetailViewController (Protocols) <UITableViewDelegate, UITableViewDataSource>

@end

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.

like image 93
God of Biscuits Avatar answered Oct 13 '22 17:10

God of Biscuits


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.

like image 35
logancautrell Avatar answered Oct 13 '22 17:10

logancautrell