Xcode如何加载主要故事板?

agr*_*986 62 xcode objective-c ios

当我使用storyboard在Xcode 4.6中创建一个新的单视图应用程序时,我们可以看到main函数使用应用程序委托创建一个新的应用程序,如下所示:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
Run Code Online (Sandbox Code Playgroud)

但是,如果我们查看MyAppDelegate.h和MyAppDelegate.m,代码中没有任何地方引用MainStoryboard.storyboard.这与非故事板版本不同,我们可以找到以编程方式加载nib文件的代码行.

所以我的问题是,故事板是如何加载的?(我应该在哪里找到它?)

Chr*_*ner 74

查看项目的目标设置

在此输入图像描述

请注意主故事板设置.

如果你想自己在代码中这样做,你会做类似的事情.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

   UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
   UIViewController *vc = [storyboard instantiateInitialViewController];

   // Set root view controller and make windows visible
   self.window.rootViewController = vc;
   [self.window makeKeyAndVisible];

   return YES;
}
Run Code Online (Sandbox Code Playgroud)

  • 你需要在`self.window.rootViewController = vc;`之前添加`self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];` (2认同)

Ram*_*uri 9

看看UIApplicationMain的讨论:

讨论
此函数从主体类实例化应用程序对象,并实例化给定类的委托(如果有)并设置应用程序的委托.它还设置主事件循环,包括应用程序的运行循环,并开始处理事件.如果应用程序的Info.plist文件指定要加载的主nib文件,通过包含NSMainNibFile键和值的有效nib文件名,此函数将加载该nib文件.

UIApplicationMain被调用,包含所有的应用程序信息plist文件中加载:

在此输入图像描述

这就是它"理解"xib/storyboard文件需要加载的方式.


zim*_*yan 7

它是从info.plist文件中的UIMainStoryboardFile设置启动的.Xcode然后创建一个主窗口,实例化您的第一个视图控制器,并将其添加到窗口.您仍然可以使用类似于.nib的代码执行此操作

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController* initialView = [storyboard instantiateInitialViewController];
Run Code Online (Sandbox Code Playgroud)


pka*_*amb 5

在 Xcode 中,确定主故事板的人类可读的 Info.plist 部分是:

Main storyboard file base name

在纯文本中,关键是UIMainStoryboardFile

<key>UIMainStoryboardFile</key>
<string>Main</string>
Run Code Online (Sandbox Code Playgroud)