我有一个UINavigationController子类:

fileprivate class NavController: UINavigationController {

  override init(navigationBarClass: AnyClass?, toolbarClass: AnyClass?) {
    super.init(navigationBarClass: navigationBarClass, toolbarClass: toolbarClass)
    ...
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  ...
}

我将这个类实例化为:
navController = NavController(navigationBarClass: nil, toolbarClass: nil)

这将编译,但在运行时失败:
AppDelegate.swift: 87: 19: fatal error: use of unimplemented initializer 'init(nibName:bundle:)' for class 'NavController'

当我指定关键字navigationBarClass:和toolbarClass:时,我不明白为什么要调用init(nibName:bundle:)。
如果我从我的子类中删除所有的初始化器,它就可以正常工作了,这很混乱,因为重写一个只调用super的方法/初始化器应该是noop。
第87行是声明类的行。我试着用调试器介入,但我不能进入UIKit代码,只能进入我的代码。
如果这很重要,这是在iOS 10和Swift 3上。

最佳答案

该问题源于UINavigationController的生命周期,因为如果在覆盖所有init时打印函数,控制台将如下所示:

init(nibName:bundle:)
init(navigationBarClass:toolbarClass:)

因此,您还必须覆盖首先调用的init(nibName:bundle:),如下所示:
class NavController: UINavigationController {

    /* Properties */

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

    override init(navigationBarClass: AnyClass?, toolbarClass: AnyClass?) {
        super.init(navigationBarClass: navigationBarClass, toolbarClass: toolbarClass)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

extension NavController {
    /* Methods */
}

10-05 20:49
查看更多