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

时间:2012-03-06 00:30:12

标签: iphone objective-c model-view-controller

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 个答案:

答案 0 :(得分:1)

您可以循环[navigationController viewControllers]数组,寻找BirdsMasterViewController的实例...使用[obj isKindOfClass:[BirdsMasterViewController class]]

答案 1 :(得分:0)

你甚至不需要代码。如果您只想更改控制器,请转到故事板并选择要更改为TabBarController的viewController。在编辑器菜单中,有一个选项,用于"嵌入",选项是TabBar和导航控制器。

enter image description here

我总是从单个视图应用程序模板开始。 "应用程序中没有代码didFinishLaunchingWithOptions:"方法,(除了返回YES)。您可以将任何viewController设置为故事板中的初始视图,方法是设置初始视图控制器复选框,或者只是将箭头拖动到您想要作为初始视图的viewController。

Is Initial View