Чистый способ сделать это - определить протокол для делегата для вторичного контроллера, в котором перечислены методы, которые необходим первичному контроллеру для обеспечения:
@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 синтезируйте свойство делегата. (Не не высвобождайте его в деструкторе.) Когда SecondaryController необходимо связаться с PrimaryController, он должен вызвать соответствующий метод для делегата.
Теперь заставьте ваш PrimaryController реализовать протокол SecondaryControllerDelegate:
@interface PrimaryController : UIViewController <SecondaryControllerDelegate> {
...
Реализация методов делегата в PrimaryController.
Наконец, ваш PrimaryController должен быть назначен делегатом SecondaryController. Как именно вы это сделаете, будет зависеть от того, создаете ли вы SecondaryController в кончике или нет. Если вы делаете, установите соединение там; если нет, сделайте это сразу после того, как вы выделите и запустите SecondaryController.
Почему вы исполняете эту песню и танцуете? Хорошо, когда вам нужно ввести другой контроллер между основным и дополнительным, или использовать дополнительный в другом месте в приложении, или даже использовать дополнительный в другом приложении (у меня есть один контроллер, который используется в трех моих четыре приложения), вам вообще не нужно менять SecondaryController; Вы просто измените класс, который должен быть его делегатом. Это невероятно экономит время в долгосрочной перспективе.