【问题标题】:Must call a designated initializer of the superclass 'UITableViewHeaderFooterView'必须调用超类 'UITableViewHeaderFooterView' 的指定初始化程序
【发布时间】: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


【解决方案1】:

不久前,我还将一个 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

【讨论】:

    猜你喜欢
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2014-09-29
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多