覆盖我的自定义 UIView 子类的初始化程序

overriding the initializer of my custom UIView subclass

这可能是一个愚蠢的问题,当我阅读解决方案时,我可能会踢自己,但我现在被难住了。

我有一个自定义的 UIView 子类:

let viewA: UIView = {...}
let viewB: UIView = {...}
let viewC: UIView = {...}
var subviews: [UIView]

class MyView: UIView {

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    init() {
      subviews = [viewA, viewB, viewC]
      super.init(frame: .zero)
      abc123(true)
    }

    func abc123(_ cols: Bool) { ... }
    ...
}

现在我想对 myView 做一个稍微修改的版本,但想保留大部分逻辑。所以稍后我在文件中添加:

class myAltView: MyView {

  required init?(coder aDecoder: NSCoder) {
      fatalError("init(coder:) has not been implemented")
  }

  override init() {
    subviews = [viewA, viewC]
    super.init(frame: .zero)
    abc123(false)
  }

}

错误明显在子类的super.init(frame: .zero)。 它不会工作,因为 super 没有实现。 我无法调用 super.super.init(frame: .zero),那么我该如何解决这个问题?

所以我开始修改 "parent class" 以包含 convenience init()init(subview: [UIView], cols: Bool),但我还是无法成功覆盖 convenience init它希望我调用 self.init 的子类,我正试图避免在子类中定义以避免冗余代码。

这应该更容易,但我似乎想不出解决办法。 任何人都可以阐明这个问题......

谢谢!

如果您在超类中重写 init(frame:) 并简单地从中调用 super 的实现,因此不改变其行为,问题就解决了。

class MyView: UIView {

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    init() {
        subviews = [viewA, viewB, viewC]
        super.init(frame: .zero)
        abc123(true)
    }

    func abc123(_ cols: Bool) {}

}