我有一个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 */
}