如何设置初始故事板

7
我有两个故事板,其中一个是默认的Main,另一个是我刚刚添加的AdminMain用于客户端,Admin用于应用程序所有者。
我想知道如何通过编程设置初始/主界面故事板。

enter image description here

附言:我知道如何通过Xcode更改它,但不知道如何以编程方式更改。

2个回答

16
您没有通过编程设置初始故事板。
实际情况是这样的。无论您在Xcode中是否列出了主要的storyboard,都会有两种情况:
1. 如果已经列出了,则该storyboard即为初始故事板,并且会在启动时自动加载,其初始视图控制器成为窗口的根视图控制器(然后接口将自动显示)。
2. 如果未列出(也就是说,如果"Main Interface"字段为空),则不会自动发生任何事情,您需要从某个地方获取一个视图控制器(可能是从storyboard中),并将其设为窗口的根视图控制器(并显示接口)。
因此,总结一下,要么所有内容都自动完成,要么什么都不自动完成。不存在您想象中的中间状态,可以在其中以编程方式更改内容,使不同的故事板自动加载。
然而,存在一种类似于中间状态的情况,即允许"Main Interface"故事板加载但忽略它。在您的application:didFinishLaunchingWithOptions:方法实现中,有时会执行我在第二个点中提到的操作,即加载另一个视图控制器并将其设为根视图控制器。这是有效的,因为我在第一个点中提到的自动内容已经在调用application:didFinishLaunchingWithOptions:方法之前完成。因此,您的代码有时允许自动内容,有时覆盖自动内容。
在我自己代码的以下示例中,我们要么使用"Main Interface"故事板加载初始视图控制器,要么根据用户默认值从故事板中加载不同的视图控制器:
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
}

@hotspring 另外,您可能会发现此问题中的代码示例有所帮助:https://dev59.com/8Wkv5IYBdhLWcg3wsCpO - Aaron Brager
请问您能否演示如何通过代码进行设置? - casillas
@AaronBrager,我已经看到了那个答案,在Admin故事板中,已经选择了初始的viewcontroller。为什么我们还需要将那个viewcontroller指定为“根视图控制器”? - casillas
@hotspring 我已经在其他地方解释过如何在不使用故事板的情况下启动应用程序。例如,请参见https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch01p004appWithoutStoryboard/bk2ch01p004appWithoutStoryboard/AppDelegate.swift - matt
请查看 @hotspring,以及 https://github.com/mattneub/RegistrationExample/blob/master/RegistrationExample/AppDelegate.swift 作为一个示例,了解如何让故事板自动加载视图控制器,以及如何手动加载。 - matt
显示剩余3条评论

5
您可以在应用程序委托中以编程方式设置故事板,如下所示:

window = UIWindow(frame: UIScreen.main.bounds)
// Or "Admin"
window!.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()! 
window!.makeKeyAndVisible()

你实际上可以设置任何视图控制器。这就是无故事板方法的连接方式。
哦,以编程方式实现的另一个优点是它延迟了故事板的初始化。如果在Xcode中使用“主接口”设置,则故事板实际上会在application:didFinishLaunchingWithOptions方法之前初始化。

感谢您。自从添加了更多的故事板后,我的应用程序由于“window”变量为空而无法启动。添加window = UIWindow(frame: UIScreen.main.bounds)解决了这个问题。 - Zun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接