Поместите методы делегата в категорию - PullRequest
18 голосов
/ 05 ноября 2011

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

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


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

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

Ответы [ 2 ]

9 голосов
/ 05 ноября 2011

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

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

@interface DetailViewController (Protocols) <UITableViewDelegate, UITableViewDataSource>

@end

в ваш основной файл .m над @ реализацией

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

5 голосов
/ 05 ноября 2011

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

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

...