Разработка многоцелевого приложения на iPhone - PullRequest
8 голосов
/ 05 марта 2009

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

Ответы [ 4 ]

7 голосов
/ 05 марта 2009

Краткий ответ: вы можете вернуться к своему делегату приложения так:

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

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

SecondaryViewController *primary = delegate.rootController.primaryController;

После этого вы можете отправлять ему сообщения на свое усмотрение. Розетки не требуются; просто свойства для каждого контроллера представления.

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

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

4 голосов
/ 06 марта 2009

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

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

0 голосов
/ 06 марта 2009

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

0 голосов
/ 05 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...