Ios 无法将UIButton子类化:必须调用超类的指定初始值设定项';UIButton';
试图将UIButton子类化,但出现错误Ios 无法将UIButton子类化:必须调用超类的指定初始值设定项';UIButton';,ios,swift,uibutton,Ios,Swift,Uibutton,试图将UIButton子类化,但出现错误必须调用超类“UIButton”的指定初始值设定项 研究几个SO帖子,或者其他几个帖子都没有帮助,因为这些解决方案不起作用 我们如何在Swift中将UIButton子类化并定义自定义init函数 import UIKit class KeyboardButton : UIButton { var letter = "" var viewController:CustomViewController? required init(
必须调用超类“UIButton”的指定初始值设定项
研究几个SO帖子,或者其他几个帖子都没有帮助,因为这些解决方案不起作用
我们如何在Swift中将UIButton
子类化并定义自定义init函数
import UIKit
class KeyboardButton : UIButton {
var letter = ""
var viewController:CustomViewController?
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
init(letter: String, viewController: CustomViewController) {
super.init()
...
}
}
您必须调用超类的指定初始值设定项:
Swift 3&4:
init(letter: String, viewController: CustomViewController) {
super.init(frame: .zero)
}
init(letter: String, viewController: CustomViewController) {
super.init(frame: CGRectZero)
}
Swift 1&2:
init(letter: String, viewController: CustomViewController) {
super.init(frame: .zero)
}
init(letter: String, viewController: CustomViewController) {
super.init(frame: CGRectZero)
}
正如注释中所说,视图通常不应该有对其控制器的引用,除非是使用委托模式的弱引用,这将提高可重用性。正如错误所说,您不能调用super.init()
,因为它不是指定的初始化器。您需要调用super.init(frame:frame)
,这意味着您需要向初始化器提供一个帧。话虽如此,这看起来相当糟糕。您可能应该实现委托模式,而不是向InitializerGood point@Paulw11提供视图控制器。谢谢您的建议。Swift新手,非常感谢您的建议。谢谢!Swift新手,因此委托模式是一个很好的建议。使用CGRectZero
作为初始帧,只是在以后对其进行更改,这似乎有点不妥。没有办法使用没有参数的初始值设定项?谢谢你的帮助!指定的初始值设定项有一个非可选参数,因此没有参数无法调用它。如果它让你感觉更好,init()
只是一个方便的初始化器,它调用init(frame:CGRectZero)
。但是如何在子类中设置按钮类型呢?@TodCunningham由于Swift严格的类型安全性,你不能完全以同样的方式进行设置。有关其他方法,请参阅。