2009-03-05 2 views
8

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

ответ

0

Если контроллеры загружены из NIB, вы можете определить выход на вторичном контроллере и подключить его к основному контроллеру в построителе интерфейса.

7

Короткий ответ: вы можете получить обратно в приложение делегата, как это:

YourAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 

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

SecondaryViewController *primary = delegate.rootController.primaryController; 

Затем вы можете отправлять ему сообщения к своему сердцу. Никаких торговых точек не требуется; просто свойства для каждого контроллера представления.

Есть много более длинных ответов, а также обсуждение того, почему эта практика может быть сомнительной, поскольку она вводит потенциально нежелательные связи между объектами. В «чистом» объектно-ориентированном дизайне вы будете следовать чистому шаблону проектирования с четкими связями между объектами в разных направлениях, что позволит вам лучше использовать код.

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

4

Чистый способ сделать это состоит в определении протокола для делегата для вторичного контроллера в котором перечислены методы, которые необходимы первичный контроллер для обеспечения:

@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; вы просто меняете класс, который теперь должен быть его делегатом. Это невероятная экономия времени в долгосрочной перспективе.

0

Использование NSNotificationCenter для развязки связи между объектами.

+0

+1 для NSNotificationCenter. –

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