UITableViewController установка делегатов и источника данных - PullRequest
0 голосов
/ 31 декабря 2010

Я немного запутался насчет UITableViewController ... Насколько я понимаю, они обычно являются делегатом и источником данных UITableView (хотя это можно сделать так, что они разные).

Однако в некоторых случаях, например, при встраивании UITableViewController в UITabBarViewController в Interface Builder, мы запускаем наш контроллер табличного представления в IB. Поэтому в моем понимании вызывается инициализатор по умолчанию.

Но в этом случае у меня есть этот кусок кода:

@interface Settings : UITableViewController {

}

И в IB я вижу, что делегат и источник данных UITableView подключены к этому классу. Мой вопрос: почему нам не нужно явно говорить, что это следующее:

@interface Settings : UITableViewController <UITableViewDelegate, UITableViewDataSource>     
{
}

А в файле .m:

- (void)viewDidLoad {
    [super viewDidLoad];
    [tableView setDelegate:self];
    [tableView setDataSource:self];
}

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

Ответы [ 2 ]

3 голосов
/ 31 декабря 2010

В угловых скобках за суперклассом вы можете указать, какие протоколы будет реализовывать ваш класс. Протоколы содержат (как и интерфейсы в Java) объявления методов, но не реализуют. Некоторые из методов помечены как обязательные, некоторые как необязательные. То есть если вы решите внедрить протокол, вам, по крайней мере, придется реализовать требуемые.

Однако вам не нужно указывать, что вы собираетесь реализовать протокол. Достаточно реализовать необходимые, и ваш делегат будет работать нормально. Это хорошая идея, чтобы указать это, хотя. Xcode и компилятор будут предупреждать вас, если оба из них обнаружат ошибки в вашей реализации (например, забыли требуемый метод, использовали неправильную сигнатуру метода и т. Д.).

0 голосов
/ 31 декабря 2010

использовать

tableView.delegate = self;tableView.dataSource = self;

вместо

[tableView setDelegate:self];
[tableView setDataSource:self];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...