Iphone 以编程方式访问视图控制器

Iphone 以编程方式访问视图控制器,iphone,objective-c,model-view-controller,Iphone,Objective C,Model View Controller,作为iOS开发新手,我一直在学习developer.apple.com上的教程,现在正在为这些示例添加功能,以进一步加深我的知识 “”教程为您提供了一个基于导航控制器的应用程序。扩展此应用程序时,我希望有一个选项卡栏控制器作为第一个视图控制器 因此,我现在有以下设置: 一切都好。但是BirdsAppDelegate(uiapplicationelegate)中有代码,它依赖于作为根视图控制器的导航控制器,因此它可以创建和分配“datacontroller”对象 这是原始代码(在添加选项卡栏控制

作为iOS开发新手,我一直在学习developer.apple.com上的教程,现在正在为这些示例添加功能,以进一步加深我的知识

“”教程为您提供了一个基于导航控制器的应用程序。扩展此应用程序时,我希望有一个选项卡栏控制器作为第一个视图控制器

因此,我现在有以下设置:

一切都好。但是BirdsAppDelegate(uiapplicationelegate)中有代码,它依赖于作为根视图控制器的导航控制器,因此它可以创建和分配“datacontroller”对象

这是原始代码(在添加选项卡栏控制器之前):

-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项
{
UINavigationController*导航控制器=(UINavigationController*)self.window.rootViewController;
BirdMasterViewController*firstViewController=(BirdMasterViewController*)[[navigationController ViewController]对象索引:0];
BirdSightingDataController*aDataController=[[BirdSightingDataController alloc]init];
firstViewController.dataController=aDataController;
返回YES;
}
现在该代码失败了,因为它假定根视图控制器是导航控制器

我已经更新了代码,使其能够工作-但在我看来,它很难看,每次更改视图控制器层次结构时都必须更改:

-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项
{
//应用程序启动后自定义的覆盖点。
UITabBarController*tabBarController=(UITabBarController*)self.window.rootViewController;
UINavigationController*导航控制器=(UINavigationController*)[[tabBarController视图控制器]对象索引:0];
BirdMasterViewController*firstViewController=(BirdMasterViewController*)[[navigationController ViewController]对象索引:0];
BirdSightingDataController*aDataController=[[BirdSightingDataController alloc]init];
firstViewController.dataController=aDataController;
返回YES;
}
所以我的问题是:我在上面的代码中所做的事情,最好的方法是什么,这样对层次结构的任何更改都不会破坏代码

如何在应用程序委托中以编程方式访问我所关注的视图控制器,以便创建和分配它的BirdSightingDataController对象


谢谢

您可以循环
[navigationController ViewController]
数组以查找BirdMasterViewController的实例。。。使用
[obj iskindof类:[birdmasterviewcontroller类]]

您甚至根本不需要该代码。如果只想更改控制器,请转到情节提要并选择要更改为TabBarController的viewController。在编辑器菜单中,有一个“嵌入”选项,选项为选项卡栏和导航控制器

我总是从单一视图应用程序模板开始。“application didFinishLaunchingWithOptions:”方法中没有代码(返回YES除外)。通过设置“是初始视图控制器”复选框,或将箭头拖动到要作为初始视图的viewController,可以将任意viewController设置为情节提要中的初始视图


你好,休伯特-我想你误解了我的问题。这不是“如何更改根视图控制器”,而是如何通过编程访问层次结构下方的视图控制器。“ApplicationIDFinishLaunchingWithOptions”中的代码是自定义代码,需要创建“BirdSightingDataController”的对象并将其分配给“BirdStartViewController”的实例变量—太好了!轻松愉快:)