覆盖我的自定义 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) {}
}
这可能是一个愚蠢的问题,当我阅读解决方案时,我可能会踢自己,但我现在被难住了。
我有一个自定义的 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) {}
}