В чем разница между методами действия и методами протокола? - PullRequest
1 голос
/ 15 ноября 2011

Я начал изучать программирование на iOS и столкнулся с чем-то вроде этого: чтобы обработать событие, когда пользователи нажимают return после ввода текста в UITextField, мой контроллер представления реализует «textFieldShouldReturn: textField» из протокола UITexTFieldDelegate.Но, чтобы обработать событие, когда «Editing Did End», мне нужно объявить метод IBAction в контроллере представления и подключить событие к нему.

В чем разница между этими двумя типами методов обработки событий?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

«Editing Did End» является частью класса UIControl, и UITextField наследует его от UIControl. Событие такого рода является одним из зарегистрированных событий касания, на которые реагирует этот класс, и способ сделать эту регистрацию - назначить действие (IBAction с использованием IB) для конкретного события.

Часть реализации протокола делегата обусловлена ​​"механизмом расширения", предоставляемым протоколами делегата в шаблонах проектирования Какао. По сути, идея заключается в том, что вы можете обеспечить специальное поведение для объекта, в данном случае UITextField, без подклассов. Представьте, например, что вы хотите какую-то проверку перед тем, как разрешить кнопку «возврат». В таком случае вы будете вынуждены установить подкласс UITextField с жестко запрограммированным кодом проверки. И для каждого отдельного кода проверки вы будете вынуждены реализовать свой подкласс. Используя механизм делегирования, вы делегируете что-то еще (обычно контроллер представления владельца текстового поля) для выполнения этого «расширения класса» без подклассов. Таким образом, вы делаете настройку класса для каждого экземпляра.

Обратите внимание, что этот подход является последовательным: все, что рассматривается как «событие» (касание, касание, завершение редактирования, все, что связано с некоторым взаимодействием пользователя с дисплеем, а не с клавиатурой), подключается к классу с помощью механизм целевого действия UIControl. Все, что является «специфичным» для экземпляра (а не для класса!), Управляется с помощью делегата.

1 голос
/ 15 ноября 2011

В протоколах (обозначается с помощью @protocol // name \ superclass) можно указать методы, которые соответствующий класс может или будет использовать или должен использовать с помощью методов @optional или @required.Можно использовать протоколы для передачи данных из одного представления в другое, если второе представление соответствует протоколу (например, @implementation Classname: NSObject). Это резко контрастирует с IBActions и пустыми функциями, которые являются локальными и недоступными длядругие контроллеры (кроме методов класса).

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