首页 文章

以编程方式创建的UIViewController在“已加载的nib但未设置视图出口”时崩溃

提问于
浏览
0

我想以编程方式创建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 回答

  • 0

    事实证明我偶然有一个名为 MyView.xib 的nib文件与 MyViewController 完全无关,但是系统试图加载它!

    当我们调用 MyViewController() (调用 init(nibName: nil, bundle: nil) )时,系统会通过查找nibName documentation中具有相似名称的nib文件来尝试智能:

    ...但是,如果未指定nib名称,并且未覆盖自定义子类中的loadView()方法,则视图控制器将使用其他方法搜索nib文件 .

    根据文档,它搜索这些:

    • MyView.xib

    • MyViewController.xib

    这是宾果游戏和崩溃的应用程序!


    Solution: 以编程方式创建 UIViewController 以始终覆盖 loadView 以防止该行为:

    class MyViewController: UIViewController {
    
        // OVERRIDE THIS TO FIX!
        override func loadView() {
            super.loadView()
        }
    
        ...
    }
    

    想试试吗? https://github.com/aunnnn/ViewController-Nib-Confusion

相关问题