【问题标题】:Programmatically-created UIViewController crash on "loaded nib but the view outlet was not set"以编程方式创建的 UIViewController 在“已加载 nib 但未设置视图出口”时崩溃
【发布时间】:2018-09-03 16:51:01
【问题描述】:

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

我的代码有什么问题?

【问题讨论】:

    标签: ios swift uiviewcontroller uikit nib


    【解决方案1】:

    原来我不小心有一个名为 MyView.xib 的 nib 文件与 MyViewController 完全无关,但系统会尝试加载它!

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

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

    根据文档,它会搜索这些:

    1. MyView.xib
    2. MyViewController.xib

    这是宾果游戏并导致应用崩溃!


    解决方案: 以编程方式创建 UIViewController 时始终覆盖 loadView 以防止该行为:

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

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

    【讨论】:

    • 拯救了我的夜晚。谢谢。
    猜你喜欢
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多