我想在没有nib的情况下以编程方式创建UIViewController,例如:
import UIKit
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// code...
}
// code...
}
并像这样使用它:
let vc = MyViewController()
self.present(vc, animated: true, completion: nil)
然而,应用程序崩溃了:
***由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:' - [UIViewController _loadViewFromNibNamed:bundle:]加载" MyViewController"笔尖但未设置视图插座。'
这很奇怪,因为我没有将任何nib文件与此视图控制器关联。
清理构建,删除派生数据,删除应用程序,重新启动模拟器,Xcode和我的Mac都无法正常工作。添加init()
并致电super.init(nibName: nil, bundle: nil)
也无济于事。
我的代码出了什么问题?
答案 0 :(得分:0)
事实证明我意外地有一个名为MyView.xib
的nib文件与MyViewController
完全无关,但是系统会尝试加载它!
当我们调用MyViewController()
(调用init(nibName: nil, bundle: nil)
)时,系统会尝试从nibName
documentation
...但是,如果您没有指定笔尖名称,并且不要覆盖 自定义子类(视图控制器)中的loadView()方法 使用其他方法搜索nib文件。
根据文档,它搜索这些:
哪个是宾果游戏并且崩溃了应用程序!
<强>解决方案:强>
在以编程方式创建loadView
以阻止该行为时,始终覆盖UIViewController
:
class MyViewController: UIViewController {
// OVERRIDE THIS TO FIX!
override func loadView() {
super.loadView()
}
...
}
想试试吗? https://github.com/aunnnn/ViewController-Nib-Confusion