【问题标题】:Accessing view controllers programmatically以编程方式访问视图控制器
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 太棒了——就是这样!很好很容易:)
    【解决方案2】:

    您甚至根本不需要该代码。如果您只想更改控制器,请转到情节提要并选择要更改为 TabBarController 的 viewController。在 Editor 菜单中,有一个“Embed In”选项,选项有 TabBar 和 Navigation 控制器。

    我总是从单一视图应用程序模板开始。 “应用程序 didFinishLaunchingWithOptions:”方法中没有代码,(返回 YES 除外)。您可以将任何 viewController 设置为情节提要中的初始视图,方法是设置 is initial View Controller 复选框,或者只需将箭头拖动到您想要作为初始视图的 viewController。

    【讨论】:

    • 嗨休伯特 - 我想你误解了我的问题。这不是“如何更改根视图控制器”,而是如何以编程方式访问层次结构中的视图控制器。 “applicationDidFinishLaunchingWithOptions”中的代码是自定义代码,需要创建“BirdSightingDataController”对象并将其分配给“BirdsMasterViewController”的实例变量
    猜你喜欢
    • 1970-01-01
    • 2016-05-05
    • 2015-07-05
    • 1970-01-01
    • 2011-07-06
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多