2

我想知道的重要一点是我正在使用故事板。我在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 中嵌入视图控制器的方法

当我运行这个应用程序initWithCoder时,FirstView中的调用被调用了两次。我找到了原因,但我不知道如何以正确的方式做到这一点。

基本上 FirstView 被初始化一次,因为它是初始场景(属性检查器中有一个复选标记设置视图“是初始视图控制器”),第二次:

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

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

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

任何提示将不胜感激。

4

2 回答 2

4

在使用故事板的应用程序中,在应用程序启动时,UIKit 在 info plist 中查找UIMainStoryboardFile 键。如果设置了 UIKit 引用该故事板并使用 -[UIStoryboard instantiateInitialViewController] 创建一个默认的根视图控制器以附加到窗口。

UIKit 正在这样做,然后在 -didFinishLaunchingWithOptions: 中,您还创建了视图控制器的新实例。这就是它被实例化两次的原因。

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

  1. 创建一个窗口
  2. 抓住故事板
  3. Instantiate view controller(s) from the storyboard.
  4. Set the root view controller for the window.
  5. Make the window key and visible.
于 2012-07-02T19:01:55.257 回答
0

除非有超出您提到的某些原因,否则您可能根本不需要打电话instantiateViewControllerWithIdentifier。如果您使用情节提要,在大多数情况下,您可以(应该)UITabBarController在情节提要中定义您的视图控制器,并让您MainTabBarController成为您的“初始视图控制器”。您还可以将视图控制器嵌入故事板的导航控制器中。

于 2012-07-01T20:40:36.263 回答