Ios 必须调用超类的指定初始值设定项';UITableViewHeaderFooterView&x27;

Ios 必须调用超类的指定初始值设定项';UITableViewHeaderFooterView&x27;,ios,swift,inheritance,swift2,Ios,Swift,Inheritance,Swift2,我正在将我的项目升级到Swift2,我有两个错误,我不知道为什么以前没有 第一个是“初始值设定项不重写其超类中指定的初始值设定项” 第二个是“必须调用超类'UITableViewHeaderFooterView'的指定初始值设定项” 这是我的班级代码: import UIKit @IBDesignable class CardShadowTableViewHeaderFooterView: UITableViewHeaderFooterView { // MAR

我正在将我的项目升级到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”也继承了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
}
然后在TableViewController的
viewDidLoad
方法中,注册子类:

tableView.registerClass(CustomHeaderFooterView.self,forHeaderFooterViewReuseIdentifier: "CustomHeaderFooterView")
最后,在
tableView:viewForHeaderInSection:
method中:

let headerView = tableView.dequeueReusableHeaderFooterViewWithIdentifier("CustomHeaderFooterView") as! CustomHeaderFooterView

//do something with headerView

return headerView

UITableViewHeaderFooterView
可能继承自
UIView
,但其指定的初始化器仍然是
init(reuseIdentifier:)
。原因是,视图的框架是由表视图委托定义的。因此,使用
init(frame:)
是没有意义的。swift的书中写道:“与Objective-C中的子类不同,swift子类默认情况下不会继承它们的超类初始值设定项。”也许最好再阅读一下“初始化”一章,特别是“初始值设定项继承和重写”一节。
let headerView = tableView.dequeueReusableHeaderFooterViewWithIdentifier("CustomHeaderFooterView") as! CustomHeaderFooterView

//do something with headerView

return headerView