如何设置初始故事板
How to set initial storyboard
我有两个故事板,其中一个默认名为 Main,另一个我刚刚添加的名为 Admin.
Main 用于客户,Admin 用于应用所有者。
我想知道您如何以编程方式设置 initial/main 界面故事板。
P.S。我知道如何通过 xcode 更改它,但不知道如何编程。
您没有以编程方式设置初始故事板。
这是它的工作原理。主界面下的 Xcode 中列出了主故事板,或者没有:
如果你这样做了,那就是最初的故事板。该故事板在启动时自动加载,其初始视图控制器成为 window 的根视图控制器(然后界面自动显示)。
如果您不这样做(也就是说,如果主界面字段为空),那么什么都不会 自动发生。由您的代码以某种方式(可能从故事板)获取视图控制器,并使其成为 window 的根视图控制器(并显示界面)。
所以,总而言之,要么一切都自动发生,要么什么都没有自动发生。没有中间状态,就像您想象的那样,您可以在其中以编程方式更改内容,以便自动加载不同的情节提要。
但是,有一种中间状态,在这种状态下,您允许主界面故事板加载 但随后您忽略它。在 application:didFinishLoading...
的实现中,您会 有时 执行我在第二个要点中所说的事情,即加载 不同的 视图控制器并使其成为根视图控制器。这是有效的,因为在调用 application:didFinishLoading...
时,我在第一个要点中提到的自动内容 已经发生 。因此,实际上,您的代码有时允许自动执行这些操作,有时又会覆盖它。
在这个来自我自己代码的示例中,我们要么使用主界面故事板加载初始视图控制器,要么我们自己从故事板加载不同的视图控制器,具体取决于用户默认值:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if let rvc = self.window?.rootViewController {
if NSUserDefaults.standardUserDefaults().objectForKey("username") as? String != nil {
self.window!.rootViewController = rvc.storyboard!.instantiateViewControllerWithIdentifier("root")
}
}
return true
}
您可以在应用委托中像这样以编程方式设置故事板:
window = UIWindow(frame: UIScreen.main.bounds)
// Or "Admin"
window!.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()!
window!.makeKeyAndVisible()
您实际上可以设置任何视图控制器。这就是 no-storyboard approach 的连接方式。
哦,在代码中这样做的另一个好处是它延迟了故事板的初始化。如果您在 Xcode 中使用 "Main Interface" 设置,故事板实际上在 application:didFinishLaunchingWithOptions
方法之前初始化。
我有两个故事板,其中一个默认名为 Main,另一个我刚刚添加的名为 Admin.
Main 用于客户,Admin 用于应用所有者。
我想知道您如何以编程方式设置 initial/main 界面故事板。
P.S。我知道如何通过 xcode 更改它,但不知道如何编程。
您没有以编程方式设置初始故事板。
这是它的工作原理。主界面下的 Xcode 中列出了主故事板,或者没有:
如果你这样做了,那就是最初的故事板。该故事板在启动时自动加载,其初始视图控制器成为 window 的根视图控制器(然后界面自动显示)。
如果您不这样做(也就是说,如果主界面字段为空),那么什么都不会 自动发生。由您的代码以某种方式(可能从故事板)获取视图控制器,并使其成为 window 的根视图控制器(并显示界面)。
所以,总而言之,要么一切都自动发生,要么什么都没有自动发生。没有中间状态,就像您想象的那样,您可以在其中以编程方式更改内容,以便自动加载不同的情节提要。
但是,有一种中间状态,在这种状态下,您允许主界面故事板加载 但随后您忽略它。在 application:didFinishLoading...
的实现中,您会 有时 执行我在第二个要点中所说的事情,即加载 不同的 视图控制器并使其成为根视图控制器。这是有效的,因为在调用 application:didFinishLoading...
时,我在第一个要点中提到的自动内容 已经发生 。因此,实际上,您的代码有时允许自动执行这些操作,有时又会覆盖它。
在这个来自我自己代码的示例中,我们要么使用主界面故事板加载初始视图控制器,要么我们自己从故事板加载不同的视图控制器,具体取决于用户默认值:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if let rvc = self.window?.rootViewController {
if NSUserDefaults.standardUserDefaults().objectForKey("username") as? String != nil {
self.window!.rootViewController = rvc.storyboard!.instantiateViewControllerWithIdentifier("root")
}
}
return true
}
您可以在应用委托中像这样以编程方式设置故事板:
window = UIWindow(frame: UIScreen.main.bounds)
// Or "Admin"
window!.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()!
window!.makeKeyAndVisible()
您实际上可以设置任何视图控制器。这就是 no-storyboard approach 的连接方式。
哦,在代码中这样做的另一个好处是它延迟了故事板的初始化。如果您在 Xcode 中使用 "Main Interface" 设置,故事板实际上在 application:didFinishLaunchingWithOptions
方法之前初始化。