为什么Swift调用了错误的初始化器?

为什么Swift调用了错误的初始化器?,swift,uinavigationcontroller,overriding,designated-initializer,Swift,Uinavigationcontroller,Overriding,Designated Initializer,我有一个UINavigationController子类: fileprivate class NavController: UINavigationController { override init(navigationBarClass: AnyClass?, toolbarClass: AnyClass?) { super.init(navigationBarClass: navigationBarClass, toolbarClass: toolbarClass)

我有一个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:)
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 */
}
因此,您还必须重写
init(nibName:bundle:)
,因为它首先被调用,如下所示:

init(nibName:bundle:)
init(navigationBarClass:toolbarClass:)
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 */
}

我不确定,将该代码放在当前项目中可以很好地工作,没有任何问题,正在实现
让navController=navController(navigationBarClass:nil,toolbarClass:nil)
这是可行的,尽管这是一个谜,为什么-覆盖某个东西来调用super应该是一个noop。它只是快速的快速,爱惹恼我们大家不确定我是否可以在这里问一个连续的问题。初始化自定义导航栏后一次。如何访问提供自定义类型的导航栏?如果这是一个新问题,我道歉。