[英]How does Xcode load the main storyboard?
当我使用 storyboard 在 Xcode 4.6 中创建一个新的单视图应用程序时,我们可以看到 main 函数使用应用程序委托创建了一个新应用程序,如下所示:
return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
然而,如果我们查看 MyAppDelegate.h 和 MyAppDelegate.m,代码中没有任何地方引用 MainStoryboard.storyboard。 这与非故事板版本不同,在非故事板版本中,我们可以找到以编程方式加载 nib 文件的代码行。
所以我的问题是,故事板是如何加载的? (我应该戳哪里才能找到它?)
查看项目的目标设置
注意主故事板设置。
如果你想自己在代码中做到这一点,你会做类似的事情。
- (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;
}
看看UIApplicationMain 的讨论:
讨论
此函数从主体类实例化应用程序对象,并从给定类实例化委托(如果有),并为应用程序设置委托。 它还设置主事件循环,包括应用程序的运行循环,并开始处理事件。 如果应用程序的 Info.plist 文件通过包含 NSMainNibFile 键和值的有效 nib 文件名指定要加载的主 nib 文件,则此函数加载该 nib 文件。
当UIApplicationMain被调用时,会加载一个包含所有应用程序信息的 plist 文件:
这就是它“理解”需要加载 xib/storyboard 文件的方式。
它从 info.plist 文件的 UIMainStoryboardFile 设置开始。 然后 Xcode 创建一个主窗口,实例化您的第一个视图控制器,并将其添加到窗口中。 您仍然可以在类似于 .nib 的代码中使用
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController* initialView = [storyboard instantiateInitialViewController];
在 Xcode 中,确定主故事板的人类可读的 Info.plist 部分是:
Main storyboard file base name
在纯文本中,关键是UIMainStoryboardFile
:
<key>UIMainStoryboardFile</key>
<string>Main</string>
如果你想用 Swift 实例化
var storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
var vc : AnyObject! = storyboard.instantiateInitialViewController()
self.window!.rootViewController = vc as UIViewController
self.window!.makeKeyAndVisible()
在 Xcode 11.3.1 中,仅更改Main storyboard 文件基本名称是不够的, Application Scene Manifest中的Storyboard Name配置也应该更改。
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Home</string>
</dict>
</array>
</dict>
</dict>
聚会有点晚,但您可以从窗口进入 viewController,如下所示
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
var viewController = window?.rootViewController as? ViewController
if let viewController = viewController {
// do awesome stuff
}
return true
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.