Может кто-нибудь, пожалуйста, объясните делегатов в объективе-c? - PullRequest
3 голосов
/ 07 ноября 2010

Я уже давно пользуюсь Objective-C и в значительной степени понимаю большинство его возможностей. Однако концепция делегатов ускользает от меня. Может ли кто-нибудь дать краткое и простое объяснение, что такое делегаты, как они используются в iPhone SDK и как я могу наилучшим образом использовать их в своем собственном коде?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 07 ноября 2010

Есть несколько основных причин использовать делегаты в Objective-C, которые слегка различаются:

  1. Расширение базовой функциональности каркасного класса. Например, UITableView довольно скучен сам по себе, поэтому вы можете дать ему делегат для обработки интересных битов (создание ячеек таблицы, добавление текста в заголовки разделов, что у вас есть). Таким образом, UITableView никогда не меняется, но разные табличные представления могут выглядеть и действовать по-разному.

  2. Связь с родительскими объектами в вашей иерархии зависимостей. Например, у вас может быть представление с кнопкой, которую пользователь может нажать, чтобы сделать что-то, что влияет на другие представления. Представление должно будет отправить сообщение своему родительскому представлению или, возможно, контроллеру представления, чтобы оно могло создавать или уничтожать или изменять другие представления. Чтобы сделать это, вы бы передали родительский объект в ваше представление, скорее всего через протокол, в качестве слабой ссылки (в Objective-C свойство assign ). Затем представление может отправить любое сообщение, объявленное в протоколе, родительскому или делегированному объекту.

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

3 голосов
/ 07 ноября 2010

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

Например, допустим, у меня есть UIViewController с UITextView, размещенным в середине представления. Я установил свой UIViewController, чтобы быть делегатом UITextView. Затем, когда определенные действия выполняются в текстовом представлении (начать редактирование, изменение текста, конец редактирования и т. Д.), Он сообщает своему делегату, что он может выполнять любую логику, необходимую для выполнения, например проверку орфографии при каждом изменении символов или отклонение команды. клавиатуру при получении клавиши возврата нажмите.

Методы делегатов выполняют функцию, аналогичную функциям обратного вызова в C.

Надеюсь, что имеет смысл:)

0 голосов
/ 03 марта 2012

Лучшая и простая концепция, которую я получил из учебного пособия на Lynda.com: «Когда вы устанавливаете делегат, это означает, что вам дали задание на выполнение».Итак, если вы хотите использовать методы, которые написаны в методе протокола, вы должны реализовать их, выполнив поиск в справочнике классов делегатов и используя их.Надеюсь, это помогло.

Кстати, делегаты - превосходные люди.Они твои друзья.Они были сделаны, чтобы сделать вашу жизнь программиста намного проще.

...