为什么Swift调用了错误的初始化器?
我有一个UINavigationController子类:为什么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)
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。它只是快速的快速,爱惹恼我们大家不确定我是否可以在这里问一个连续的问题。初始化自定义导航栏后一次。如何访问提供自定义类型的导航栏?如果这是一个新问题,我道歉。