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对象?
谢谢!
答案 0 :(得分:1)
您可以循环[navigationController viewControllers]
数组,寻找BirdsMasterViewController的实例...使用[obj isKindOfClass:[BirdsMasterViewController class]]
。
答案 1 :(得分:0)
你甚至不需要代码。如果您只想更改控制器,请转到故事板并选择要更改为TabBarController的viewController。在编辑器菜单中,有一个选项,用于"嵌入",选项是TabBar和导航控制器。
我总是从单个视图应用程序模板开始。 "应用程序中没有代码didFinishLaunchingWithOptions:"方法,(除了返回YES)。您可以将任何viewController设置为故事板中的初始视图,方法是设置初始视图控制器复选框,或者只是将箭头拖动到您想要作为初始视图的viewController。