Передача сообщений дочерним элементам контейнерных контроллеров представления из пользовательского контроллера представления контейнера?

Приношу свои извинения за длинный заголовок, но это действительно самая короткая, точная и описательная версия, которую я смог придумать.

Я реализую пользовательский контроллер представления контейнера с пользовательским типом segue, работаю с iOS 5 и раскадровками. Я также предоставляю протокол делегата для автономных контроллеров представления, предназначенный для работы во многом как UINavigationControllerDelegate. В настоящее время я отправляю сообщение делегата из моего пользовательского контейнера, которое информирует контроллер дочернего представления segued-from о состоянии, касающемся моего пользовательского перехода, о котором он должен знать для выполнения определенного действия.

Это достаточно просто с моими собственными подклассами UIViewController, которые я могу указать для соответствия протоколу в файле.h.

Однако, когда содержащиеся контроллеры представления моего пользовательского контейнера сами являются встроенными контейнерами (например, UINavigationController, UITabBarController), сообщение делегата, которое я отправляю, не обязательно имеет смысл для этого контейнера, но оно будет активным дочерним представлением. Контроллер, который этот контейнер в настоящее время показывает. Встроенные контейнеры явно впереди обычного view(Will|Did)(Disa|A)ppear звонки своим детям, но я не вижу общего способа распространения этой пересылки на мое собственное сообщение.

Быстрое и грязное решение состояло бы в том, чтобы создать подкласс этого встроенного контейнера и добавить к нему пересылку сообщений делегата. Например, MyTabBarController будет соответствовать протоколу делегата и переслать сообщение делегата его selectedViewController, Альтернативой является то, что мой пользовательский контейнер будет активно прослушивать, если контроллер представления, который он содержит, сам по себе является контейнером, но это еще более грязно и не может учитывать будущие типы контейнеров, которые могут однажды быть вложенными в мой пользовательский контейнер.

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

Итак, какие-либо предложения помимо двух решений, которые я уже описал?

2 ответа

Решение

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

Для моих конкретных потребностей я хотел, чтобы контроллер панели вкладок перенаправлял сообщение делегата на выбранный контроллер представления. Я создал категорию на UITabBarController под названием MessageForwarding с реализацией правильной сигнатуры метода. Метод категории только что перенаправил идентичный вызов self.selectedViewController, возвращая результат.

Мой класс контейнера затем импортировал эту категорию, и вуаля, контроллеры панели вкладок теперь волшебным образом делают правильные вещи и пересылают сообщение делегата, которое я отправляю в свой контейнер.

Подобную категорию было бы тривиально реализовать для раздельных контроллеров представления и навигации и любых пользовательских контейнеров, которые нужно использовать.

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

Смотрите NSObject's -conformsToProtocol:,

Другие вопросы по тегам