我想以编程方式创建UIViewController而不使用nib,例如:
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)
也无济于事 .
我的代码出了什么问题?
1 回答
事实证明我偶然有一个名为
MyView.xib
的nib文件与MyViewController
完全无关,但是系统试图加载它!当我们调用
MyViewController()
(调用init(nibName: nil, bundle: nil)
)时,系统会通过查找nibName documentation中具有相似名称的nib文件来尝试智能:根据文档,它搜索这些:
MyView.xib
MyViewController.xib
这是宾果游戏和崩溃的应用程序!
Solution: 以编程方式创建
UIViewController
以始终覆盖loadView
以防止该行为:想试试吗? https://github.com/aunnnn/ViewController-Nib-Confusion