Доступ к контроллерам вида программно - PullRequest
2 голосов
/ 06 марта 2012

Впервые в разработке для iOS, я следовал учебным пособиям на developer.apple.com и теперь добавляю функциональность в эти примеры, чтобы расширить свои знания.

В учебнике " second ios app " представлено приложение на основе контроллера навигации. Расширяя это приложение, я хочу иметь контроллер панели вкладок в качестве первого контроллера представления.

Итак, теперь у меня есть следующие настройки:

Storyboard

Все хорошо. Но в BirdsAppDelegate (UIApplicationDelegate) есть код, который полагался на контроллер навигации, являющийся корневым контроллером представления, поэтому он может создавать и назначать объект «datacontroller».

Это оригинальный код (до того, как я добавил контроллер панели вкладок):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
    BirdsMasterViewController *firstViewController = (BirdsMasterViewController *)[[navigationController viewControllers] objectAtIndex:0];

    BirdSightingDataController *aDataController = [[BirdSightingDataController alloc] init];
    firstViewController.dataController = aDataController;
    return YES;
}

Теперь этот код не работает, поскольку предполагается, что контроллер корневого представления является контроллером навигации.

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    UITabBarController *tabBarController =  (UITabBarController *)self.window.rootViewController;

    UINavigationController *navigationController = (UINavigationController *)    [[tabBarController viewControllers] objectAtIndex:0];

    BirdsMasterViewController *firstViewController = (BirdsMasterViewController*) [[navigationController viewControllers] objectAtIndex:0];

    BirdSightingDataController *aDataController = [[BirdSightingDataController alloc] init];

    firstViewController.dataController = aDataController;

    return YES;
}

Итак, мой вопрос: как лучше сделать то, что я делаю в приведенном выше коде, чтобы любые изменения в иерархии не нарушали код?

Как получить программный доступ к контроллеру представления, который мне нужен в делегате приложения, чтобы я мог создать и назначить его объект BirdSightingDataController?

Спасибо!

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Вы можете зациклить массив [navigationController viewControllers] в поисках экземпляра BirdsMasterViewController ... Используя [obj isKindOfClass:[BirdsMasterViewController class]].

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

Тебе даже не нужен этот код. Если вы просто хотите изменить контроллер, перейдите к раскадровке и выберите viewController, который вы хотите изменить на TabBarController. В меню «Редактор» есть опция «Внедрить», варианты выбора - «TabBar» и «Навигационные контроллеры».

enter image description here

Я всегда начинаю с одного шаблона представления приложения. В методе "application didFinishLaunchingWithOptions:" нет кода (кроме случаев возврата YES). Вы можете установить любой viewController в качестве начального представления в раскадровке, установив флажок «Начальный View Controller», или просто перетащив стрелку в viewController, который вы хотите использовать в качестве начального представления.

Is Initial View

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