第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:)
?
答案 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:)
,它是一个指定的初始化程序,无论您是否使用故事板,都必须调用它。
钥匙带走:
convenience init
将使用init(nibName:bundle:)
作为参数为您调用nil
。因此,如果您没有继承默认的init()方法,那么您有责任覆盖它并调用init(nibName:bundle:)