Objective-C-сообщение контроллера вида от делегата приложения


Я хочу загрузить некоторые данные в делегат приложения в - application:didFinishLaunchingWithOptions:

После того, как я загрузил некоторые данные, я хочу установить эти данные в свойство NSArray в контроллере вида. Если у меня есть синтезированное свойство NSArray (неатомное, сохраняющее) под названием data, я хотел бы сделать [viewController setData:downloadedData];

Как я могу вызвать активный экземпляр viewController из делегата приложения?

Моя структура приложения-это контроллер панели вкладок в качестве корневого контроллера.

2 2

2 ответа:

Вы захотите использовать NSNotificationCenter, который будет по существу транслировать сообщение всем объектам, подписавшимся на это конкретное сообщение.

В контроллере вида подпишитесь на уведомление:

[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(downloadedData:) 
    notificationName:@"DownloadedData" 
    object:data];

- downloadedData:(NSNotification *)notification {
    self.data = notification.object;
}

И в вашем делегате приложения отправьте уведомление подписчикам:

[[NSNotificationCenter defaultCenter] 
    postNotificationName:@"DownloadedData" 
    object:data];

Добавьте свойство delegateComplete в класс делегатов приложения:

//define ivar
id delegateComplete;

//define property
@property (nonatomic, retain) id delegateComplete;

//synthesize
@synthesize delegateComplete;

В методе init или viewDidLoad вашего viewController выполните следующие действия:

MainClass *appDelegate = (MainClass *)[[UIApplication sharedApplication] delegate];
appDelegate.delegateComplete = self;

Замените MainClass классом приложения. После завершения загрузки выполните следующие действия в делегате приложения:

[delegateComplete loadingCompletedWithData:data];

Не забудьте добавить этот метод в свой viewController:

- (void)loadingCompletedWithData:(NSData *)data

Происходит следующее: контроллер вида регистрируется в делегате приложения. По завершении загрузки, если ваш контроллер вида имеет зарегистрирован, вызов loadingCompletedWithData. Правильный способ сделать это-через протокол.