繁体   English   中英

故事板-initWithCoder被调用两次

[英]Storyboards - initWithCoder gets called twice

我想知道的重要一点是我正在使用情节提要。 我在didFinishLaunchingWithOptions中执行以下操作:

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];

FirstView *mvc = [sb instantiateViewControllerWithIdentifier:@"FirstView"];
SecondView *tvc = [sb instantiateViewControllerWithIdentifier:@"SecondView"];

NSArray* controllers = [NSArray arrayWithObjects:[self addNavigationToViewController:mvc], [self addNavigationToViewController:tvc], nil];

// add controllers to a table view
UITabBarController *tb = [[UITabBarController alloc] init];
[tb setViewControllers:controllers];

[self.window setRootViewController:tb];

addNavigationToViewController是我用来在UINavigationController中嵌入视图控制器的一种方法

当我运行此应用程序时, FirstView中initWithCoder被调用两次。 我找到了原因,但我不知道如何正确地做。

基本上,由于FirstView是Initial Scene (它是Initial Scene)而被初始化了一次(在Attributes Inspector中有一个选中标记,将视图设置为“ Is initial view controller”),并且第二次:

FirstView *mvc = [sb instantiateViewControllerWithIdentifier:@"FirstView"];

如果我取消选中“ 初始场景”,它会抱怨“也许未设置指定的入口点”。

我做错了什么,但我不知道这是什么。

任何提示将不胜感激。

在使用情节提要的应用程序中,在应用程序启动时,UIKit在信息plist中查找UIMainStoryboardFile键 如果已设置,则UIKit会引用该情节提要,并使用-[UIStoryboard InstantiateInitialViewController]创建默认的根视图控制器以附加到窗口。

UIKit就是这样做的,然后在-didFinishLaunchingWithOptions:中,您还将创建视图控制器的新实例。 这就是为什么要实例化两次。

如果您希望完全自定义此过程,并且看起来像您一样,那么您可能不希望UIKit代表您执行这些默认操作。 您可以简单地从info.plist中删除UIMainStoryboardFile键,并在-didFinishLaunchingWithOptions:中覆盖,您可以:

  1. 创建一个窗口
  2. 抓住情节提要
  3. 从情节提要中实例化视图控制器。
  4. 设置窗口的根视图控制器。
  5. 使窗口键可见。

除非有您没有提到的其他原因,否则您可能根本不需要调用instantiateViewControllerWithIdentifier 如果您使用情节MainTabBarController板,则在大多数情况下,您可以(应该)在情节MainTabBarController板中定义UITabBarController的视图控制器,并将MainTabBarController “初始视图控制器”。 您还可以将视图控制器嵌入情节提要中的“导航控制器”中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM