Подтвердить что ты не робот

Поместить методы делегата в категорию

Я разработал приложение до сих пор. Теперь я пишу новый, и в этом проекте я хочу, чтобы код был очень чистым, поэтому очень легко найти методы.
Я хочу начать с UIViewControllers, чье представление имеет UITableView как subview. Я хочу иметь файл с именем DetailViewController для всех функций, которые принадлежат ему непосредственно. Другой файл с именем DetailViewController+Protocols должен содержать категорию класса выше и все эти методы делегирования UITableView.

Можно ли сделать что-то подобное? Я хочу, чтобы мой код был чистым и разделил его на несколько файлов.


ИЗМЕНИТЬ

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

Но тогда Xcode показывает предупреждение о том, что некоторые из методов делегата не реализованы в DetailViewController. Я также попробовал это с импортом DetailViewController + Protocols.h в DetailViewController.h. Без изменений.
Затем я попробовал это, не обращая внимания на предупреждения и посмотрел: это сработало! Но почему? Не следует ли работать без этих предупреждений?

4b9b3361

Ответ 1

Да, это так. Единственное, что нужно учитывать в категориях, - это не те свойства @synthesize. Добавление ivars в категории также труднее.

Подробнее об этом см. this.

Ответ 2

Вам не нужно создавать полностью отдельный именованный протокол в другом файле, если вы используете его только для одного класса. На самом деле, вы, вероятно, не должны, потому что это просто запутывает.

Если вы хотите, чтобы ваш основной файл .h был чистым, просто переместите это:

@interface DetailViewController (Protocols) <UITableViewDelegate, UITableViewDataSource>

@end

в ваш основной файл .m над файлом @implementation

Я не понимаю, почему вы не хотели бы объявлять в своем .h, что ваш основной класс реализует протоколы делегата tableview и datasource. Они носят описательный характер.