Имеет ли смысл, что в приложении для iPhone может быть несколько классов, соответствующих протоколу UIApplicationDelegate? - PullRequest
6 голосов
/ 09 апреля 2009

Мне кажется, я понял, что должен делать этот делегат. Если класс соответствует этому протоколу, он сообщает базовой системе: «Эй, чувак, я являюсь делегатом объекта UIApplication! Скажи мне, что случилось, и я могу сказать, что делать!».

Что, если несколько классов реализуют это? Это возможно? Это имеет какой-то смысл?

Ответы [ 4 ]

10 голосов
/ 09 апреля 2009

Хотя вы можете реализовать несколько классов, соответствующих протоколу UIApplicationDelegate, только один, первый, получит эти сообщения.

Реализация протокола для создания делегата - это только одна часть уравнения. Затем этот делегат должен быть зарегистрирован в коде, который генерирует сообщения, и эти системы обычно поддерживают только один делегат.

В случае UIApplication вы можете изменить делегата с помощью свойства «делегат» в общем классе UIApplication, но это заменит исходный делегат, а не добавит дополнительный.

Если вам нужно транслировать сообщения уровня UIApplication на другие системы, то эту функциональность вы должны добавить к существующему делегату.

5 голосов
/ 09 апреля 2009

Вы можете реализовать несколько классов, которые принимают протокол UIApplicationDelegate, но только один может быть фактическим делегатом в любой момент времени. Это установлено [UIApplication sharedApplication].delegate, который обычно устанавливается основным файлом NIB через соединение розетки.

4 голосов
/ 09 апреля 2009

Простое соответствие протоколу не устанавливает ваш объект в качестве делегата, вам нужно сделать это явно либо в кончике, либо в коде. Как уже упоминалось, только один объект может быть делегатом одновременно. Наличие нескольких делегатов может иметь смысл в некоторых случаях - например, если у вас есть табличное представление, отображающее два набора данных, вы можете создать для него два объекта делегата и источника данных и переключаться между ними по мере необходимости. Вероятно, не имеет смысла делать это для делегата приложения, поскольку код там довольно специфичен.

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

1 голос
/ 10 апреля 2009

Как сказал Дэниел Диксон:

Вы можете реализовать несколько классов, которые принимают протокол UIApplicationDelegate, но только один может быть фактическим делегатом в любой момент времени. Он устанавливается с помощью [UIApplication sharedApplication] .delegate, который обычно устанавливается основным файлом NIB с помощью выходного соединения.

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

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