2013-07-30 2 views
4

Это серьезная проблема для меня прямо сейчас. Работа над базой кода с многоуровневыми детскими диспетчерскими представлениями размером около 4-5 слоев - это приложение для планшетов с очень высокой степенью развязки между диспетчерами viewcontrollers. Детский диспетчер просмотра 5-го уровня хочет отправить сообщение в диспетчер представления верхнего уровня, чтобы показать модальный. У 4-го уровня и 3-го уровня есть разные сообщения, так что в основном теперь у меня есть 4 протокола, и довольно сложно отправлять сообщения с таких дочерних контроллеров просмотра, вложенных в глубину в контроллер представления предков. Есть ли более простой способ сделать это?Многоуровневые контроллеры детского просмотра, где делегация становится кошмаром - как они должны общаться друг с другом?

Мы думали об использовании NSNotification, но не особенно любили его из-за его сложности в отладке и подписке, не являющейся явной зависимостью внутри нашего контроля. Мы также думали об использовании синглета, но статика и синглтоны являются злыми (правильно?) И вызывают проблемы вокруг состояния и параллелизма.

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

+0

Что вы подразумеваете под «многоуровневыми детскими контроллерами просмотра размером около 4-5 слоев»? Вы говорите о стеке контроллера навигации? Кроме того, контроллеры 3,4 и 5 должны общаться только с 1 или общаться друг с другом. – rdelmar

+0

A-> контроллер детского просмотра B-> контроллера детского просмотра C-> контроллера детского просмотра D. Что-то происходит в D, о котором ему нужно рассказать A. Обычная делегация диктует, что протокол D, реализованный A и D, передает его C-> B-> A OR A, который проходит до D, к которому он может делегировать. Проблема в том, что все эти диспетчеры viewcontrollers разговаривают с A и друг с другом, и, следовательно, у меня есть 4-5 разных протоколов, которые имеют пересечения некоторых общих методов и некоторые разные - в основном создавая беспорядок. Лучший способ сделать это с помощью многоуровневых контроллеров детского просмотра? – Rickster

+0

Я все еще не уверен, что понимаю иерархию контроллера. Когда вы говорите о ребенке, вы имеете в виду, как в [b addChildViewController: A]? Нет стека контроллера навигации? – rdelmar

ответ

0

Интересный вопрос, но я думаю, нам нужно немного советов, таких как схема.
Первой мыслью, почему вам нужно добавить вложенного ребенка? не могли ли вы управлять простым стеком и одним контейнером VC? Кажется, что не правильно, как вы управляете своими венчурными капиталистами. Если они нуждаются в уведомлении об изменениях в модели, она должна быть только видимой, чтобы поймать их, в viewWill/Did/появятся другие, вы можете снова запросить свежие данные. Если вам нужно сообщить каждому VC об их состояниях, я думаю, вы должны изменить свою иерархию.
Я представляю себе Контейнер VC со стеком или набором VC и видимым VC. Этот Контейнер будет управлять обменом информацией. Как сказал рделмар, это кажется действительно высокой степенью сцепления. Вы должны пересмотреть путь, который видит связь только между контейнером и видимым VC, другие могут обновлять свои данные, пока они появляются.

+0

yes - так что в принципе, я думаю, мы соглашаемся с основным контроллером просмотра контейнера, который контролирует дочерние элементы до глубины 1 и не более. Это в основном заимствует из эквивалентного дизайна Android, где одна активность играет роль передачи между фрагментами, которые он размещает – Rickster

+0

Точно. Такой подход следует применять аналогично тому, как в UINavigationViewController или UITabbarViewController. Контроллер контейнера сохраняет согласованность между другими VC. Вы должны посмотреть здесь, это действительно хорошо объяснено https://developer.apple.ком/библиотека/ИОС/# featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html – Andrea

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