У меня есть приложение с контроллером корневого представления, контроллером основного представления и контроллером вторичного представления. Я хотел бы иметь возможность отправить сообщение в основной контроллер представления из контроллера вторичного представления. Как я могу получить ссылку на основной, чтобы я мог отправлять ему сообщения? Есть ли лучший способ сделать это?Архивирование приложения с несколькими видами на iPhone
ответ
Если контроллеры загружены из NIB, вы можете определить выход на вторичном контроллере и подключить его к основному контроллеру в построителе интерфейса.
Короткий ответ: вы можете получить обратно в приложение делегата, как это:
YourAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
Вы, вероятно, уже есть указатель на ваш контроллер представления корня в своем классе приложение делегата. Вероятно, у вас есть указатели на ваши первичные и вторичные контроллеры представлений в объекте корневого контроллера. Таким образом, вы можете написать код следующим образом:
SecondaryViewController *primary = delegate.rootController.primaryController;
Затем вы можете отправлять ему сообщения к своему сердцу. Никаких торговых точек не требуется; просто свойства для каждого контроллера представления.
Есть много более длинных ответов, а также обсуждение того, почему эта практика может быть сомнительной, поскольку она вводит потенциально нежелательные связи между объектами. В «чистом» объектно-ориентированном дизайне вы будете следовать чистому шаблону проектирования с четкими связями между объектами в разных направлениях, что позволит вам лучше использовать код.
Другой вариант - передать указатели на объекты, которые потребуются классу во время инициализации. Внедрите новый initWithSomethingOrOther для своих классов контроллера представления и передайте объекты в качестве параметров. Кэшируйте эти указатели, которые вам нужны (не забудьте их сохранить) для последующего использования.
Чистый способ сделать это состоит в определении протокола для делегата для вторичного контроллера в котором перечислены методы, которые необходимы первичный контроллер для обеспечения:
@protocol SecondaryControllerDelegate <NSObject>
- (void)secondaryController:(SecondaryController*)secondaryController
frobFooWithBar:(Bar*)myBar;
- (BOOL)secondaryController:(SecondaryController*)secondaryController
shouldTwiddleBaz:(Baz*)currentBaz;
@end
Теперь добавьте свойство делегата к SecondaryController:
@interface SecondaryController : UIViewController {
id <SecondaryControllerDelegate> delegate;
...
}
// delegates are one of the few places you don't retain an object
@property (assign) id <SecondaryControllerDelegate> delegate;
...
В разделе реализации SecondaryController синтезируется свойство делегата. (Do не отпустите его в деструкторе.) Когда SecondaryController должен взаимодействовать с PrimaryController, он должен вызвать соответствующий метод для делегата.
Теперь сделать свой PrimaryController реализовать протокол SecondaryControllerDelegate:
@interface PrimaryController : UIViewController <SecondaryControllerDelegate> {
...
Реализовать методы делегата в PrimaryController.
Наконец, ваш PrimaryController настроен как делегат SecondaryController. Точно, как вы это сделаете, будет зависеть от того, создаете ли вы SecondaryController в нибе или нет. Если да, сделайте соединение там; если нет, сделайте это сразу после выделения и запустите SecondaryController.
Почему вы исполняете эту песню и танцуете?Ну, когда вам нужно ввести другой контроллер между Primary и Secondary или использовать Secondary в другом месте приложения, или даже использовать Secondary в еще одно приложение (у меня есть один контроллер, который используется в трех моих четырех приложениях) вам вообще не нужно менять SecondaryController; вы просто меняете класс, который теперь должен быть его делегатом. Это невероятная экономия времени в долгосрочной перспективе.
Использование NSNotificationCenter для развязки связи между объектами.
- 1. Структурирование приложения iPhone с несколькими видами
- 2. iPhone: управление несколькими видами (экраном)?
- 3. iPhone - обработка памяти с несколькими видами
- 4. Реализация приложения с несколькими видами в GWT
- 5. UIViewcontroller с несколькими видами
- 6. Панель инструментов iPhone, разделяемая несколькими видами
- 7. Перемещение между несколькими видами в iphone
- 8. Интернационализация с несколькими видами
- 9. iphone-SDK, обмен данными между несколькими видами
- 10. UIPageViewController с несколькими видами
- 11. Дизайн приложения iPAD с несколькими видимыми видами на экране
- 12. MultiViewPager с несколькими видами
- 13. overridePendingTransition с несколькими видами
- 14. UITapGestureRecognizer с несколькими видами
- 15. Доступ на основе CanCan с несколькими видами
- 16. Создание страниц с несколькими видами
- 17. Durandal Widget с несколькими видами
- 18. Проблема с несколькими модальными видами
- 19. Использование объектаAtIndex с несколькими видами
- 20. IPhone OpenGL ES с одним или несколькими видами?
- 21. эллипсис с несколькими текстовыми видами
- 22. Синхронизация анимации с несколькими видами
- 23. Сохраненная процедура с несколькими видами
- 24. Один контроллер с несколькими видами
- 25. Android Listview с несколькими видами
- 26. Директива AngularJS с несколькими видами
- 27. Проблема с несколькими видами iOS
- 28. ListView с несколькими видами макетов
- 29. экземпляр экземпляра с несколькими видами
- 30. Xcode - архивирование приложения - значок выдает
+1 для NSNotificationCenter. –