我正在尝试子类化UIButton,但我希望它是类型.system。我正在努力与初始化者
class FormButton: UIButton {
var type FormButtonType: FormButtomType.oneSelection
init(oftype formType: FormButtomType) {
self.type = formType
super.init(type: .system)
}
}
问题是我有以下错误消息:"必须调用超类的指定初始化程序' UIButton'
答案 0 :(得分:1)
您无法覆盖便捷方法并调用超便捷方法......
作为替代方法,您可以执行返回FormButton
UIButtonType.system
类型的静态方法。
class FormButton: UIButton {
class func newButton() -> FormButton {
return FormButton.init(type: .system)
}
}
像这样使用
let button = FormButton.newButton()
答案 1 :(得分:0)
你需要呼叫超类'指定的初始化程序:
init(oftype formType: FormButtomType) {
super.init(frame: yourframe)
self.type = formType
}
答案 2 :(得分:0)
错误有点令人困惑
必须调用超类的指定初始值设定项' UIButton'
但它试图说的是你需要在使用self
之前调用指定的初始化程序。因此,在self.type
调用后转移super.init
来电。您创建了一个convenience
初始化工具,不需要拨打超级电话,您需要拨打self
。
首先,这一行在语法上是错误的。
var type FormButtonType: FormButtomType.oneSelection
应该是
var type: FormButtonType = FormButtomType.oneSelection
现在您可以轻松地将其子类化。
import UIKit
class FormButton: UIButton {
var type: FormButtonType = FormButtomType.oneSelection
// convenence initializer, simply call self if you have
// initialized type
convenience init(type: UIButtonType) {
self.init(type: type)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
现在,如果您要初始化某些不具有默认值或可选值的属性,则需要override
指定的初始值。
例如,
class FormButton: UIButton {
var type: UIButtonType = UIButtonType.system
var hello: String // property doesn't have initial value
// This is designated initialiser
override init(frame: CGRect) {
self.hello = "Hello"
super.init(frame: .zero)
}
convenience init(type: UIButtonType) {
self.init(type: .system)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
答案 3 :(得分:0)
我猜测由于突出显示的动画行为,您需要System type
。
如果是这样,您可以在override
子类中Highlighted
UIButton
属性,如下所示:
var isHighlighted: Bool {
didSet {
// If you have images in your button, add them here same as the code below
(self.isHighlighted && self.titleLabel != nil) ? (self.titleLabel!.alpha = 0.2) : (self.titleLabel!.alpha = 1.0)
}
}