понимание методов в цель-с - PullRequest
3 голосов
/ 25 августа 2009

например, мы используем этот метод в табличном представлении

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 16;
}

Я хочу узнать, что мы нигде не вызываем этот метод, но приложение читает это значение, как оно? Есть много таких методов, которые мы не вызывали.

Ответы [ 4 ]

11 голосов
/ 25 августа 2009

Ваш объект был установлен в качестве источника данных UITableView где-то. Скорее всего, путем установления соединения в InterfaceBuilder, хотя это просто сделать в коде, установив свойство dataSource UITableView:

- (void) setUpMyJunkMan
{
    myTableView.dataSource = self;
}

Как только вы установите свой объект в качестве источника данных, табличное представление будет вызывать метод по мере необходимости, чтобы определить, что ему нужно нарисовать или как ему нужно реагировать на события.

Ваш объект должен реализовывать протокол UITableViewDataSource (хотя, если вы подключили источник данных через InterfaceBuilder, если вы этого не сделаете, жалоб может не быть - это скорее проверка времени компиляции, чем время выполнения один).

Если вы посмотрите на объявление UITableViewDataSource, вы увидите, что число методов @optional. Остальные @required; Вы должны реализовать их, чтобы выполнить контракт протокола.

Это ключевое различие между источниками данных и делегатами. Делегаты могут по желанию реализовать любой из объявленных методов. Источники данных создают гораздо более формальные отношения между двумя объектами, в которых некоторые методы должны быть реализованы.

1 голос
/ 25 августа 2009

Простой способ понять, почему вызывается метод - установить точку останова, запустить в режиме отладки, а затем посмотреть трассировку стека.

Для этого конкретного случая - он вызывается автоматически фреймворком при рендеринге табличного представления.

Я думаю, вам действительно нужно взглянуть на Руководство по программированию табличного представления , чтобы у вас было хорошее понимание того, какие методы нужно переопределять (а не переопределять) при использовании табличных представлений. Если вы расширяете класс TableViewController, фреймворк выполняет большую часть тяжелой работы, и вам едва приходится писать какой-либо код.

0 голосов
/ 25 августа 2009

Это часть интерфейса делегата.

В какой-то момент в вашем приложении (возможно, в UIBuilder) вы указали, что объект, содержащий метод, на самом деле является делегированным объектом. Это означает, что когда вы хотите настроить поведение (в данном случае UITableView), вы можете фактически не расширять UITableView, а просто изменять методы делегатов.

в основном класс UITableView будет выглядеть примерно так:

- (void) AMethodinUiTableView 
{

int colums =[self.delegate numberOfSectionsInTableView:self];
}

для получения дополнительной информации я бы ознакомился с программированием delgate и селекторами.

0 голосов
/ 25 августа 2009

numberOfSectionsInTableView: вызывается представлением таблицы.

Вы реализуете numberOfSectionsInTableView: как часть протокола UITableViewDataSource. Каждому UITableView присваивается dataSource. Обычно, UITableView будет построен как UITableViewController, который установит себя как dataSource.

Когда вид отображается, он вызывает numberOfSectionsInTableView: на своем dataSource.

Это объясняется в Руководство по программированию табличного представления для iPhone OS .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...