以编程方式在不同情节提要文件中的视图之间进行选择

时间:2018-11-01 10:08:16

标签: swift xcode storyboard

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

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

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

但是,当我运行它时,出现以下错误:

  

'NSInternalInconsistencyException',原因:'无法在捆绑包中加载NIB:'NSBundle ...,名称为'AttendDetailViewController'

我已经尝试了互联网上针对此问题的所有解决方案,并且我认为这可能与视图位于不同情节提要中有关。

有没有想到如何毫无例外地进行这种搜索?

2 个答案:

答案 0 :(得分:1)

您必须从捆绑包中获取情节提要:

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)
}

答案 1 :(得分:0)

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()