Почему некоторым объявлениям методов в протоколе UITableViewDataSource предшествует tableView:(UITableView *)tableview?

Формулировка вопроса может ввести в заблуждение. Я понимаю, почему для такого метода, как cellForRowAtIndexPath, полезно получать указатель на соответствующий UITableView.

Чего я не понимаю, так это более мудрого с точки зрения Objective-C: я хотел бы назвать это особым способом объявления методов?

Как если бы объект (например, UITableView), у которого есть какой-то внутренний протокол (например, UITableViewDataSource), отправлял бы сообщения разработчикам, используя особый способ ссылки на себя.

т.е. Вместо того, чтобы передавать ссылку на себя в качестве обычного аргумента сообщения Objective-C, UITableView использует этот специальный синтаксис?


person Ariel Malka    schedule 04.02.2010    source источник
comment
Последнее дополнение, из постера с вопросами ... Хорошо, это была просто путаница Java-парня с одним аспектом Objective-C: сообщения несопоставимы с методами Java или функциями C. Первый параметр сообщения не должен уподобляться тому, к чему мы привыкли: то есть имени функции. Другими словами, внутри сообщения Objective-C: все параметры равны по важности.   -  person Ariel Malka    schedule 06.02.2010


Ответы (1)


Изменить

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

Это сводилось к смешению двух методов,

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

Первый метод — это метод экземпляра UITableView, который возвращает UITableViewCell для заданного индексного пути. Этот метод вызывается для объекта табличного представления.

Второй метод — это метод источника данных, объявленный в протоколе UITableViewDataSource, который запрашивает UITableViewCell для данного пути индекса.

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

Надеюсь, это поможет.


Большинство протоколов делегирования/источника данных в Cocoa/Cocoa Touch следуют этому шаблону. Это способ сказать что-то вроде «это табличное представление хочет эти данные».

Рассмотрим что-то вроде объекта текстового поля. У вас может быть интерфейс со многими объектами текстовых полей, которые все сообщают одному и тому же делегату, чтобы определить их поведение для определенных действий. Передавая себя в качестве аргумента в методе делегату, делегат знает, какое текстовое поле вызывает метод.

Я не уверен, что полностью понимаю, о чем вы спрашиваете, но именно так объекты сообщают своим делегатам/источникам данных, какой именно объект отправляет метод. В случае UITableView это менее очевидно, потому что часто существует только одно представление таблицы для каждого контроллера представления таблицы, но пример текстового поля, который я привел, должен подчеркнуть этот факт.

person Jasarien    schedule 04.02.2010
comment
Спасибо, но это не ответ на мой вопрос. Я понимаю, почему этот механизм полезен. Я просто хочу дать ему имя, чтобы понять, почему это не делается с использованием обычного метода Objective-C (т.е. передачи себя в качестве ссылки, в качестве обычного аргумента сообщения, а не таинственного префикса сообщения...) - person Ariel Malka; 04.02.2010
comment
Я не понимаю, что вы спрашиваете. Экземпляр табличного представления вызывает этот метод для своего делегата/источника данных, и он действительно передает себя как обычный аргумент сообщения. С точки зрения табличного представления метод выглядит как [dataSource tableView:self cellForRowAtIndexPath:indexPath]; (вероятно, упрощенно, но смысл остается в силе). - person Jasarien; 04.02.2010
comment
Извините, но это не то, что я называю обычным аргументом сообщения. Обычный означает: ‹code›[dataSource cellForRowAtIndexPath:indexPath withTableView:self]‹/code›. В любом случае ваш пример помогает лучше понять этот синтаксис. - person Ariel Malka; 04.02.2010
comment
Между tableView:cellForRoatIndexPath: и cellForRowAtIndexPath:withTableView: нет никакой разницы, кроме порядка параметров и способа чтения метода, что, я думаю, довольно важно, но тем не менее. Как я сказал в своем первоначальном ответе, если вы читаете метод, как если бы это было предложение, это было бы похоже на то, что это табличное представление хочет ячейку для этого indexPath, тогда как ваш метод подобен тому, что для этого нужна ячейка для этого indexPath табличный вид. Я предполагаю, что это зависит от личного вкуса, что вы предпочитаете, но между ними нет технической разницы. - person Jasarien; 04.02.2010
comment
Тем не менее, это может сбивать с толку, и я настаиваю на том, что тема недостаточно документирована (я не могу найти ссылку на Objective-C по этой теме...) Взгляните на официальные документы UITableView: внутри экземпляра Параграф «Методы», в нем упоминается - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath. Теперь, как вы должны знать, что этот метод также получает параметр UITableView? - person Ariel Malka; 04.02.2010
comment
Это не. Это совершенно другой метод. cellForRowAtIndexPath: — это метод экземпляра UITableView, который возвращает конкретную ячейку по определенному индексному пути. Однако tableView:cellForRowAtIndexPath: — это метод источника данных, определенный в протоколе UITableViewDataSource, который запрашивает у источника данных ячейку, которая должна отображаться в этом индексном пути. - person Jasarien; 04.02.2010
comment
Спасибо, вся дискуссия действительно помогла мне рассеять путаницу (я полагаю, боль в пищеварении Objective-C...) - person Ariel Malka; 04.02.2010
comment
Не за что, рад, что смог помочь :) - person Jasarien; 04.02.2010