Put delegate methods into a category

2020-06-07 07:29发布

问题:

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?

回答1:

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.



回答2:

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.