必须调用超类的指定初始化程序' UITableViewHeaderFooterView'

时间:2015-12-07 10:32:17

标签: ios swift inheritance swift2

我正在努力将我的项目升级到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()
        }

    }
  • 那么为什么我从第一个错误中理解我正在尝试 覆盖&#39; UITableViewHeaderFooterView&#39;
  • 的错误初始化
  • 对于我试图调用不存在的init的第二个 &#39; UITableViewHeaderFooterView&#39;

真正导致&#39; UITableViewHeaderFooterView&#39;是

public init(reuseIdentifier: String?)
public init?(coder aDecoder: NSCoder)

但是&#39; UITableViewHeaderFooterView&#39;还使用我需要的public init(frame: CGRect)

的init继承UIView

这是我在TableViewController中用来创建标题的代码。

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let headerShadowView = CardShadowTableViewHeaderFooterView(frame: CGRectMake(0,0,320,45))

        return headerShadowView
    }

所以可能有一些我无法获得的东西,我正在寻找一些关于如何解决我的错误并理解所有这些混乱的帮助和指导。

1 个答案:

答案 0 :(得分:4)

前段时间我还将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:方法:

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

//do something with headerView

return headerView