为什么Swift会调用错误的初始化程序?

时间:2017-03-07 08:31:20

标签: swift uinavigationcontroller method-overriding designated-initializer

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

1 个答案:

答案 0 :(得分:1)

问题源于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 */ } ,如下所示:

private StudentDatabaseEntities db = new StudentDatabaseEntities();

public List<StudentDatabaseDbTableModel> AllProducts()
{
    return db.StudentDatabaseDbTableModel.ToList();
}