【发布时间】:2012-03-06 00:30:12
【问题描述】:
刚接触 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 对象?
谢谢!
【问题讨论】:
标签: iphone objective-c model-view-controller