迅速使用未实现的初始化程序' init()'

时间:2014-10-26 16:39:03

标签: ios swift ios8

第1部分

我正在使用NSExtensionPrincipalClass而不是故事板编写Today Widget扩展。我实现了以下必需的init

required init(coder aDecoder: NSCoder) {
    tableView = UITableView()
    cellIdentifier = "kCellIdentifier"

    super.init(coder: aDecoder)
}

但是,当我运行项目时,我收到以下错误

use of unimplemented initializer 'init()'

因此,通过在项目中添加此附加代码,它将解决问题,但在多个位置初始化变量似乎不正确

override init() {
    tableView = UITableView()
    cellIdentifier = "kCellIdentifier"

    super.init()
}

第2部分

所以我回答了下面问题的第一部分,但我仍然不知道为什么以下解决方案不起作用?

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    cellIdentifier = "kCell"
    tableView = UITableView()
    super.init(nibName: nil, bundle: nil)
}

根据Swift的文档

  

“如果您的子类提供了其所有超类的实现   指定的初始化程序 - 通过按照规则1继承它们,或者通过   提供自定义实现作为其定义的一部分 - 然后它   自动继承所有超类的便利性   初始值设定“。

在UIViewController中,init(nibName:bundle:)是唯一指定的已初始化,为什么我不会自动继承init()init(coder:)

1 个答案:

答案 0 :(得分:4)

因此,在重新阅读swift的初始化器章节并查看UIViewController头文件后,我的问题的第一部分是解决方案

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override init() {
    cellIdentifier = "kCellIdentifier"
    tableView = UITableView()
    super.init(nibName: nil, bundle: nil)
}

此解决方案的关键之一是init(nibName:bundle:),它是一个指定的初始化程序,无论您是否使用故事板,都必须调用它。

钥匙带走:

  • 如果在声明变量时没有为变量提供值,则会丢失超类中所有初始化器的继承。这意味着您必须提供自己的init或override超类初始值设定项,并调用超类的相应指定初始值设定项。此外,您必须实现所有必需的初始化程序。
  • 默认情况下,在UIViewController中,convenience init将使用init(nibName:bundle:)作为参数为您调用nil。因此,如果您没有继承默认的init()方法,那么您有责任覆盖它并调用init(nibName:bundle:)