Протокол - это своего рода контракт, который гласит: Я обещаю предоставить не необязательные методы, определенные в протоколе, и, возможно, даже необязательные. Его назначение подобно интерфейсам Java: обойти отсутствует множественное наследование.
Шаблон делегата в Objective-C обычно работает следующим образом: вы определяете протокол, а затем в своем классе вы определяете переменную, такую как id<MyProtocol> myDelegate;
, и определяете установщик и, возможно, получатель (либо обычными методами, например, * 1006). * или через свойства.
Обратите внимание, что делегат не сохранен! Поэтому, если вы работаете со свойством, вам нужен параметр assign
, а не retain
.
Теперь, вернувшись в свой класс, вы проверяете, является ли myDelegate
нулем, и если нет, вы можете напрямую вызывать его необязательные методы. Если вы хотите вызвать дополнительный метод, вам сначала нужно проверить его наличие с помощью respondsToSelector:
.
Так что, если вы решите использовать шаблон делегата, вам нужно определить протокол, добавить этот протокол в свой контроллер представления корневой таблицы, реализовать там необходимые методы и обязательно вызвать [foo setDelegate:self];
или что-то подобное для информирования вашего другой класс, которым корневой контроллер представления таблицы является делегатом. И, конечно, реализовать вызовы делегатов в вашем классе.
Edit:
Альтернативой может быть использование NSNotification
s, кстати. Преимущество уведомлений заключается в том, что вы можете прослушивать несколько объектов и реагировать на них. Недостатком является то, что вы не можете (напрямую) передавать значения обратно. Например, вы можете определить метод делегата, который спрашивает делегата, делать ли что-то или нет. С уведомлениями это невозможно, это больше похоже на крик в комнату, чем на разговор один на один.