instantiateViewControllerWithIdentifier:创建VC的副本还是故事板不会被创建

时间:2014-02-10 14:27:57

标签: ios iphone uiviewcontroller uistoryboard

作为“年轻的iOS padawan”,我有以下愚蠢的问题要求 -

在Xcode 5中,我创建了an iPhone app storyboard(包含导航控制器,管理其他3个视图控制器)和AppDelegate.m中的以下代码:

Storyboard screenshot

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *vc1 = [storyboard instantiateViewControllerWithIdentifier:@"Master"];
    //UIViewController *vc2 = [storyboard instantiateViewControllerWithIdentifier:@"Login"];
    UIViewController *vc3 = [storyboard instantiateViewControllerWithIdentifier:@"User"];

    User *user = [User load];
    NSArray *controllers = (user ? @[vc1, vc3] : @[vc1]);

    UINavigationController *nc = (UINavigationController *)self.window.rootViewController;
    [nc setViewControllers:controllers];

    return YES;
}

我的问题是:,因为在上面的代码中使用了self.window.rootViewController,这意味着应用已经加载了Main.storyboard文件,并且VC已“冻结”在其中已被实例化,对吗?

这是否意味着,当我致电instantiateViewControllerWithIdentifier时,会创建每个VC的第二个副本

当我在应用程序的源代码中设置/更改VC上的属性时,故事板管理的VC不受影响(但仍会显示给用户)?

1 个答案:

答案 0 :(得分:1)

  

应用已加载Main.storyboard文件

  

当我调用instantiateViewControllerWithIdentifier时,会创建每个VC的第二个副本

是的,如果视图控制器在根导航控制器内,否则没有(因为应用程序应该没有理由加载它们)。因此,对于主视图控制器是,对于用户视图控制器,则为no。

  

稍后在VC上设置/更改属性

这实际上取决于代码

故事板是一个容器,用你的话说,是“冻结”(真正存档的)视图控制器和视图。您的代码不会更改故事板内容,它只是在不同的时间根据不同的触发器加载归档的不同部分。从Storyboard存档创建这些元素后,您可以修改它们,但这是基于您的代码的运行时修改。