问题

我开始看看Swift编程语言,不知为何我不能正确地从特定的UIStoryboard输入一个UIViewController的初始化。

在Objective-C中,我简单地写:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"StoryboardName" bundle:nil];
UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewControllerID"];
[self presentViewController:viewController animated:YES completion:nil];

有人能帮助我如何在斯威夫特上实现这一点吗?


当前回答

如果你想以模态方式呈现它,你应该有如下所示的东西:

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewControllerID")
self.showDetailViewController(vc as! YourViewControllerClassName, sender: self)

其他回答

无论我怎么尝试,它都不适合我——没有错误,但我的屏幕上也没有新的视图控制器。不知道为什么,但是在超时函数中包装它最终使它工作:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.0) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "TabletViewController")
    self.present(controller, animated: true, completion: nil)
}

我创建了一个库,可以用更好的语法更容易地处理这个问题:

https://github.com/Jasperav/Storyboardable

只需改变Storyboard.swift,让ViewControllers符合Storyboardable。

斯威夫特5

let vc = self.storyboard!.instantiateViewController(withIdentifier: "CVIdentifier")
self.present(vc, animated: true, completion: nil)

我知道这是一个旧线程,但我认为目前的解决方案(使用硬编码的字符串标识符为给定的视图控制器)是非常容易出错。

我已经创建了一个构建时脚本(你可以在这里访问),它将创建一个编译器安全的方式来访问和实例化给定项目中的所有故事板中的视图控制器。

例如,在Main中名为vc1的视图控制器。故事板将像这样实例化:

let vc: UIViewController = R.storyboard.Main.vc1^  // where the '^' character initialize the controller

Swift 4.2更新的代码是

let storyboard = UIStoryboard(name: "StoryboardNameHere", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "ViewControllerNameHere")
self.present(controller, animated: true, completion: nil)