Objective-C-сообщение контроллера вида от делегата приложения
Я хочу загрузить некоторые данные в делегат приложения в - application:didFinishLaunchingWithOptions:
После того, как я загрузил некоторые данные, я хочу установить эти данные в свойство NSArray
в контроллере вида. Если у меня есть синтезированное свойство NSArray (неатомное, сохраняющее) под названием data
, я хотел бы сделать [viewController setData:downloadedData];
Как я могу вызвать активный экземпляр viewController из делегата приложения?
Моя структура приложения-это контроллер панели вкладок в качестве корневого контроллера.
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. Правильный способ сделать это-через протокол.