以编程方式在不同故事板文件中的视图之间进行 Segue

Programmatically Segue Between Views in Different Storyboard Files

我在 Host.storyboard 中有一个视图 HostViewController,并且在情节提要中我可以在 Main.storyboard 中转到 AttendDetailViewController。但是,我想按如下方式以编程方式执行此操作:

private func attendDetailViewControllerSegue(event: CAEvent) {
    let vc = AttendDetailViewController(nibName: "AttendDetailViewController", bundle: nil)
    vc.event = event

    navigationController?.pushViewController(vc, animated: true)
}

但是,当我 运行 这样做时,出现以下错误:

'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle ... with name 'AttendDetailViewController''

这个问题网上的各种解决办法我都试过了,感觉可能和不同storyboard的views有关。

关于如何无一例外地执行此 segue 有任何想法吗?

1-从xib加载(当你的项目中有AttendDetailViewController.xib文件时使用)

 let vc  = AttendDetailViewController(nibName: "AttendDetailViewController", bundle: nil)

2- 从情节提要中加载(当 vc 在情节提要中时使用)

 let vc = UIStoryboard(name: "Host", bundle: nil)!.instantiateViewController(withIdentifier: "vciD") as? AttendDetailViewController

3- 以编程方式加载(在以编程方式创建 vc 布局时使用)

let vc = AttendDetailViewController()

您必须从捆绑包中获取故事板:

var hostStoryboard = UIStoryboard(name: "Host", bundle: Bundle.main)

然后,实例化并呈现视图控制器:

let someViewController = hostStoryboard?.instantiateViewController(withIdentifier: "AttendDetailViewController") as? AttendDetailViewController
self.navigationController?.present(attendDetailViewController!, animated: true)

不要忘记在故事板中设置 AttendDetailViewController 的故事板标识符。


我还建议您在使用前安全地解开 attendDetailViewController

let someViewController = hostStoryboard?.instantiateViewController(withIdentifier: "AttendDetailViewController") as? AttendDetailViewController
if let vc = attendDetailViewController {
    self.navigationController?.present(vc, animated: true)
}