如何从情节提要以编程方式加载 UIViewController?

Posted

技术标签:

【中文标题】如何从情节提要以编程方式加载 UIViewController?【英文标题】:How to load UIViewController programmatically from storyboard? 【发布时间】:2014-08-24 16:59:53 【问题描述】:

我在 Main.storyboard 中创建了一个带有几个按钮和标签的 UIViewController。我正在尝试使用 self.presentViewController 切换到该视图控制器,但它不会从情节提要中加载视图。默认情况下它只会加载一个空白的黑屏。关于如何从我在情节提要中创建的视图加载视图的任何想法?

self.presentViewController(ResultViewController(), animated: true, completion: nil)

【问题讨论】:

How to call a View Controller programmatically? 的可能重复项 【参考方案1】:

您这样做的方式只是创建视图控制器的一个新实例。它不会根据您在 Interface Builder 中定义的原型创建一个。相反,您应该使用它,其中“SomeID”是您在 Interface Builder 中分配给视图控制器的情节提要 ID。

if let resultController = storyboard!.instantiateViewControllerWithIdentifier("SomeID") as? ResultViewController 
    presentViewController(resultController, animated: true, completion: nil)

您可以在 Interface Builder 的身份检查器中为您的视图控制器分配一个故事板 ID。

【讨论】:

只是一个评论,你需要添加一个!在 Swift 2 中的故事板之后【参考方案2】:

完整的 Swift 3 代码,包括 Storyboard 的实例化:

let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)

if let mainViewController = storyboard.instantiateInitialViewController() 
    present(mainViewController, animated: false, completion: nil)

【讨论】:

如何在 MacOS(Cocoa) 上做到这一点?【参考方案3】:

SWIFT 5.2

首先,您应该为 viewcontroller 定义一个 storyboardID 并在使用此代码后

 let storyboard = UIStoryboard(name: "Main", bundle: nil) // type storyboard name instead of Main
 if let myViewController = storyboard.instantiateViewController(withIdentifier: "myViewControllerID") as? CourseDetailVC 
       present(myViewController, animated: true, completion: nil)
 

【讨论】:

以上是关于如何从情节提要以编程方式加载 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

当我以编程方式从情节提要加载窗口时,为啥在 NSView 中未调用 drawRect?

从情节提要重新加载视图时,以编程方式添加的 iOS 子视图会丢失

如何在 ios swift 中以编程方式将情节提要视图控制器加载到标签栏控制器中?

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

如何以编程方式更改使用自动布局在情节提要上创建的 UIImageView 的大小?

如何摆脱或更改情节提要以编程方式创建 segue