Как установить свойства на начальном контроллере представления (созданном в раскадровке) из 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;
    }
}

Пожалуйста, следуйте ниже сообщения для более подробной информации. Передача данных между контроллерами представления

Другие вопросы по тегам