我正在将我的项目升级到Swift2,但遇到了两个错误,我真的不知道为什么以前没有这些错误。
第一个是 “ Initializer不会从其超类覆盖指定的初始化器”
第二个是 “必须调用超类'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'的错误初始化
对于第二个,我试图调用“ UITableViewHeaderFooterView”的不存在的init
确实是因为'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 }
因此,可能有些事情我没有得到,我正在寻找有关如何纠正错误和理解所有这些混乱的帮助和指导。
不久前,我还将obj-c代码库升级到swift2并遇到了相同的问题。
我最终所做的是:
在我的自定义UITableViewHeaderFooterView
子类中,我覆盖了初始化程序。
override init(reuseIdentifier: String?) { super.init(reuseIdentifier: reuseIdentifier) commonInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) commonInit() } func commonInit() { //initialize my subviews }
然后在viewDidLoad
TableViewController的方法中,注册子类:
tableView.registerClass(CustomHeaderFooterView.self,forHeaderFooterViewReuseIdentifier: "CustomHeaderFooterView")
最后,在tableView:viewForHeaderInSection:
方法中:
let headerView = tableView.dequeueReusableHeaderFooterViewWithIdentifier("CustomHeaderFooterView") as! CustomHeaderFooterView //do something with headerView return headerView