问题

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

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

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

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


当前回答

if let destinationVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DestinationVC") as? DestinationVC{
            let nav = self.navigationController
            //presenting
            nav?.present(destinationVC, animated: true, completion: {
                
            })
            //push
            nav?.pushViewController(destinationVC, animated: true)
        }

其他回答

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

https://github.com/Jasperav/Storyboardable

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

这个答案是针对Swift 5.4和iOS 14.5 SDK进行的最新修订。


这只是新语法和稍微修改的api的问题。UIKit的底层功能并没有改变。对于绝大多数iOS SDK框架来说都是如此。

let storyboard = UIStoryboard(name: "myStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "myVCID")
self.present(vc, animated: true)

确保在故事板中“故事板ID”下设置myVCID。

akashivsky的答案很好!但是,如果你从呈现的视图控制器返回时遇到一些麻烦,这个替代方法会很有用。这对我很管用!

迅速:

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("someViewController") as! UIViewController
// Alternative way to present the new view controller
self.navigationController?.showViewController(vc, sender: nil)

Obj - c:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"someViewController"];
[self.navigationController showViewController:vc sender:nil];

对于那些使用@akashivsky的答案来实例化UIViewController的人来说,有一个异常:

致命错误:类使用了未实现的初始化式'init(coder:)'

快速提示:

手动实现所需的初始化?(coder aDecoder: NSCoder)在你的目标UIViewController,你试图实例化

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

如果你需要更多的描述,请参考我在这里的回答

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

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

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

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