如何设置初始情节提要

Posted

技术标签:

【中文标题】如何设置初始情节提要【英文标题】:How to set initial storyboard 【发布时间】:2017-07-30 21:24:05 【问题描述】:

我有两个故事板,其中一个默认称为 Main,而我刚刚添加的另一个故事板称为 Admin

Main 用于客户,Admin 用于应用所有者。

我想知道您如何以编程方式设置初始/主界面故事板。

附:我知道如何通过 xcode 更改它,但不知道如何编程。

【问题讨论】:

【参考方案1】:

您没有以编程方式设置初始情节提要。

这是它的工作原理。要么你在 Xcode 的 Main Interface 下列出了一个主故事板,要么你没有:

如果你这样做,那就是最初的故事板,句号。该故事板在启动时自动加载,其初始视图控制器成为窗口的根视图控制器(然后自动显示界面)。

如果您不这样做(也就是说,如果主界面字段为空),则 什么都不会发生 自动发生。由您的代码以某种方式(可能从情节提要)获取视图控制器,并使其成为窗口的根视图控制器(并显示界面)。

所以,总而言之,要么一切都自动发生,要么什么都没有自动发生。正如您似乎想象的那样,没有中间状态,您可以在其中以编程方式更改内容,以便自动加载不同的故事板。

但是,有一种中间状态,您允许主界面故事板加载但随后您忽略它。在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

【讨论】:

我不知道为什么有人不赞成你的回答。无论如何,我刚刚投了赞成票,阅读了您的回答。 对不起,我不小心投了反对票,但我想投赞成票。 ?? @hotspring 此外,您可能会发现此问题中的代码示例很有帮助:***.com/questions/10428629/… 能否请您说明如何通过代码设置? @AaronBrager,我已经看到了这个答案,在管理员故事板中,已经选择了初始 viewcontroller。为什么我们仍然需要将该视图控制器分配为rootviewcontroller【参考方案2】:

您可以在应用委托中像这样以编程方式设置情节提要:

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

您实际上可以设置任何视图控制器。这就是no-storyboard approach 的连接方式。

哦,在代码中这样做的另一个好处是它延迟了故事板的初始化。如果您在 Xcode 中使用“主界面”设置,情节提要实际上是在 application:didFinishLaunchingWithOptions 方法之前初始化的。

【讨论】:

(无关)谢谢。由于添加了更多 Storyboard,我的应用程序无法启动,因为 window 变量为零。添加window = UIWindow(frame: UIScreen.main.bounds) 解决了这个问题。

以上是关于如何设置初始情节提要的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 managedObjectContext 使用情节提要来初始化下一个控制器

如何使用给定的根视图控制器和初始视图控制器实例化情节提要?

带有情节提要的 viewController 自定义初始化方法

如何以编程方式从情节提要中填充静态 UITableView?

使用情节提要时未调用 UITableViewController 覆盖初始化函数

使用情节提要设置标签文本时的短暂延迟