1

Как и многие другие разработчики, новые для Cocoa, я борюсь с концепцией делегата и контроллера. Я получаю основы, но меня беспокоит одна вещь. Практически каждое объяснение говорит, что «обычно» или «в простых случаях» (которые являются единственными, которые они приводят в качестве примеров). Контроллер и делегат имеют тенденцию быть одним и тем же объектом. Это приводит к вопросу: когда вы хотите разделить контроллер и делегат для одного и того же объекта интерфейса?Отдельный делегат и контроллер

ответ

2

Два общий случая при использовании отдельного класса для нужен ваш делегата является

  1. Когда вам нужно выполнить несвязанные действия в ответ на то же делегат сообщение или
  2. Когда вы хотели бы поделиться логика делегата среди нескольких представлений или контроллеров.

Примером первой ситуации может быть страница с двумя несвязанными таблицами. Каждому UITableView понадобится собственный делегат, поэтому использование контроллера в качестве делегата потребует уродливого оператора if в каждом методе делегата; определение и использование отдельных делегатов явно предпочтительнее в этом случае.

Примером второй ситуации может быть группа похожих страниц, которые показывают данные БД из таблиц аналогичной структуры. Сами страницы достаточно разнородны, поэтому вы не можете полностью использовать контроллер во всей его полноте. Если вы решите поставить делегата в контроллер, большая часть логики источника данных в виде таблицы будет идентичной. Вы можете поместить код в общую реализацию делегата и каждый контроллер создаст экземпляр этого делегата с параметрами конфигурации, специфичными для таблицы, связанной с этим контроллером.

Следует иметь в виду, что при использовании другого объекта помимо контроллера в качестве вашего делегата: контроллер должен сохранять/поддерживать сильную ссылку на делегата, поскольку представление будет поддерживать только слабую/назначающую ссылку на него. См. property "assign" and "retain" for delegate для получения дополнительной информации.

Смежные вопросы