Как установить свойства на начальном контроллере представления (созданном в раскадровке) из AppDelegate?
Я делаю вызов API в моем AppDelegate.m didFinishLauncingWithOptions
метод. Полученный JSON будет переведен в NSArray
объектов. Я хотел бы установить свойство моего первого контроллера представления для этого массива, чтобы контроллер представления мог использовать latitude
а также longitude
свойства этих объектов для определения местоположения.
Что-то вроде этого:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// array retrieved - in actual application, this is an API call and translation
Obj *object1 = [[Obj alloc] init];
Obj *object2 = [[Obj alloc] init];
Obj *object3 = [[Obj alloc] init];
NSArray *arrayOfObjectsToMap = [NSArray arrayWithObjects:object1, object2, object3, nil];
// pass object array along to first view controller
firstController.objectList = arrayOfObjectsToMap;
return YES;
}
У меня проблемы с выяснением, как установить свойства на первом контроллере, который был создан в раскадровке. self.window.rootViewController
AppDelegate имеет тип UIViewController
и мой начальный контроллер имеет тип MapViewController
с NSArray
собственность сродни objectList
Свойство в примере выше.
3 ответа
Убедитесь, что вы импортировали заголовочный файл вашего контроллера вида:
#import "MapViewController.h"
Затем, поскольку вы знаете, что ваш начальный контроллер представления имеет тип MapViewController, просто добавьте приведение к выражению:
((MapViewController *)firstController).objectList = arrayOfObjectsToMap;
Чтобы сделать его более безопасным, вы можете проверить, действительно ли контроллер представления является MapViewController.
if ([firstController isKindOfClass:[MapViewController class]]) {
((MapViewController *)firstController).objectList = arrayOfObjectsToMap;
}
Обновить
Другим вариантом будет приведение в нужное место firstController
переменная:
MapViewController *firstController = (MapViewController *)self.window.rootViewController;
Я решил решить эту проблему, сохранив объекты, созданные в Core Data (в качестве альтернативы, я мог бы использовать Singleton или другое хранилище) и создать свой начальный контроллер представления для чтения объектов из Core Data.
Вы можете использовать следующий метод для передачи данных в контроллер представления с помощью segue.
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"showDetailSegue"]){
ViewControllerB *controller = (ViewControllerB *)segue.destinationViewController;
controller.isSomethingEnabled = YES;
}
}
Пожалуйста, следуйте ниже сообщения для более подробной информации. Передача данных между контроллерами представления