0

我有一个 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 上。

4

1 回答 1

1

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

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 */
}
于 2017-03-07T09:22:30.657 回答