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

时间:2018-03-25 13:17:34

标签: ios swift uiviewcontroller uikit nib

我想在没有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)也无济于事。

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

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

当我们调用MyViewController()(调用init(nibName: nil, bundle: nil))时,系统会尝试从nibName documentation

中找到具有相似名称的nib文件,从而变得聪明
  

...但是,如果您没有指定笔尖名称,并且不要覆盖   自定义子类(视图控制器)中的loadView()方法   使用其他方法搜索nib文件。

根据文档,它搜索这些:

  1. MyView.xib
  2. MyViewController.xib
  3. 哪个是宾果游戏并且崩溃了应用程序!

    <强>解决方案: 在以编程方式创建loadView以阻止该行为时,始终覆盖UIViewController

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

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