【发布时间】:2016-03-11 22:19:32
【问题描述】:
我正在努力将我的项目升级到 Swift2,但我遇到了两个错误,我真的不知道为什么我以前没有这些错误。
第一个是“初始化器不会覆盖其超类中指定的初始化器”
第二个是“必须调用超类'UITableViewHeaderFooterView'的指定初始化器”
这是我班级的代码:
import UIKit
@IBDesignable
class CardShadowTableViewHeaderFooterView: UITableViewHeaderFooterView {
// MARK: - Public
override init(frame: CGRect) { <-- First error
super.init(frame: frame) <-- Second error
self.applyCardShadowStyle()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.applyCardShadowStyle()
}
// MARK: - Overrides
override func layoutSubviews() {
super.layoutSubviews()
self.updateCardShadowPath()
}
}
- 那么为什么我从第一个错误中理解是我试图 覆盖 'UITableViewHeaderFooterView' 的错误初始化
- 第二个我试图调用一个不存在的 init 'UITableViewHeaderFooterView'
真正的原因是'UITableViewHeaderFooterView'的初始值是
public init(reuseIdentifier: String?)
public init?(coder aDecoder: NSCoder)
但 'UITableViewHeaderFooterView' 也继承自 UIView 并带有我需要的 init public init(frame: CGRect)
这是我在 TableViewController 中用来创建标题的代码。
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerShadowView = CardShadowTableViewHeaderFooterView(frame: CGRectMake(0,0,320,45))
return headerShadowView
}
所以可能有一些我没有得到的东西,我正在寻找一些帮助和指导来解决我的错误并理解所有这些混乱。
【问题讨论】:
-
UITableViewHeaderFooterView可能继承自UIView,但其指定的初始化程序仍然是init(reuseIdentifier:)。原因是视图的框架是由表视图委托定义的。所以使用init(frame:)没有意义。 -
来自 swift book:“与 Objective-C 中的子类不同,Swift 子类默认情况下不继承它们的超类初始化器。”最好再次阅读“初始化”一章,特别是“初始化器继承和覆盖”部分。
标签: ios swift inheritance swift2