[英]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:中覆盖,您可以:
除非有您没有提到的其他原因,否则您可能根本不需要调用instantiateViewControllerWithIdentifier
。 如果您使用情节MainTabBarController
板,则在大多数情况下,您可以(应该)在情节MainTabBarController
板中定义UITabBarController
的视图控制器,并将MainTabBarController
“初始视图控制器”。 您还可以将视图控制器嵌入情节提要中的“导航控制器”中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.