Ios 无法将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子类化,但出现错误
必须调用超类“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严格的类型安全性,你不能完全以同样的方式进行设置。有关其他方法,请参阅。