Я часто нахожу, что я пишу классы "утилиты", которые можно повторно использовать во всех моих проектах.
Например, предположим, что у меня есть представление "Адресная книга". Возможно, мне захочется использовать мою адресную книгу, чтобы выбрать, кому отправлено электронное письмо, или, может быть, кто добавится к запросу собрания.
Я бы разработал этот контроллер вида, чтобы он мог использоваться как контроллером электронной почты, так и контроллером совещаний, с каким-то механизмом обратного вызова, позволяющим вызывающему абоненту знать, что пользователь либо завершил выбор кого-либо из адресной книги, либо они отменен.
Похоже, что в этом сценарии есть четыре (разумных) подхода;
-
Создайте протокол AddressBookDelegate и соответствующее свойство делегата в AddressBookController. Затем используйте сообщения, определенные в протоколе, чтобы сообщить результат (аналогично UIActionSheetDelegate).
-
Создайте "неофициальный" протокол "AddressBookDelegate" и соответствующее свойство делегата в AddressBookController, но тип свойства делегата будет "id" и будет проверяться во время выполнения с помощью "responsesToSelector:", чтобы узнать, делегат реализует методы, которые нам нужны (кажется, что большинство фреймворков началось таким образом).
-
Передайте AddressBookController идентификатор, представляющий делегат, а также два SEL, которые определяют методы вызова, когда пользователь выбирает пользователя или отменяет запрос. Преимущество, которое я вижу в этом; предположим, что один контроллер поддерживает BOTH, отправляя электронные письма и настраивая встречи (в этом примере я знаю, что это плохой дизайн... но можно представить более общую ситуацию, когда это выглядит вполне разумным для класса утилит). В этом случае вы могли бы передайте адресату AddressBookController разные SEL в зависимости от того, добавляете ли вы пользователей к электронной почте или добавляете пользователей на встречу... огромное улучшение по сравнению с iVar, чтобы указать состояние контроллера.
-
Передайте AddressBookController два блока; один для запуска, когда пользователь выбирает кого-либо из адресной книги, а другой для запуска, если пользователь отменяет запрос.
Блоки были настолько полезны для меня, и SO намного более изящный, я почти смутился, когда НЕ использовал их.
Я надеюсь, что более опытные члены сообщества StackOverflow, чем я могу помочь с их мыслями по этой теме.