Впервые в разработке для iOS, я следовал учебным пособиям на developer.apple.com и теперь добавляю функциональность в эти примеры, чтобы расширить свои знания.
В учебнике " second ios app " представлено приложение на основе контроллера навигации. Расширяя это приложение, я хочу иметь контроллер панели вкладок в качестве первого контроллера представления.
Итак, теперь у меня есть следующие настройки:

Все хорошо. Но в 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?
Спасибо!