有没有办法在 Swift 中设置自定义按钮 class 的按钮类型(例如:将按钮类型设置为 .system)?

Is there a way to set the buttonType of a custom button class in Swift (ex: setting the button type to .system)?

我下面有这个自定义按钮 class:

import UIKit
class CustomButton: UIButton {
    init(title: String) {
        super.init(frame: .zero)
        let height: CGFloat = 38
        setTitleColor(UIColor.white, for: .normal)
        setTitle(title, for: .normal)
        setDimensions(height: height, width: 120)
        layer.cornerRadius = height/7
        backgroundColor = .red
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

这是我的控制器中使用此 class:

创建按钮的代码
private let loginButton: UIButton = {
        let button = CustomButton(title: "Login")
        button.isEnabled = false
        button.addTarget(self, action: #selector(handleLogin), for: .touchUpInside)
        return button
    }()

我无法为它分配一个 buttonType,因为 buttonType 是一个只能获取的 属性。通常我只是通过说 let button = UIButton(type: .system) 来分配 buttonType,但在上面,我通过使它成为 CustomButton class 的按钮来创建按钮。如何为这个自定义按钮 class 设置按钮类型?谢谢

由于按钮类型是 get-only 属性,设置它的唯一方法是调用 init(type:) 初始化程序。要调用它,您可以这样做:

class CustomButton: UIButton {
    convenience init(title: String, type: UIButton.ButtonType = .system) {
        self.init(type: type)
        let height: CGFloat = 38
        setTitleColor(UIColor.white, for: .normal)
        setTitle(title, for: .normal)
        setDimensions(height: height, width: 120)
        layer.cornerRadius = height/7
        backgroundColor = .red
        self.buttonType
    }

    ...

}

注意 init(type:) 是一个便利初始化器,所以它必须从一个便利初始化器委托。这意味着您无法在 init(title:type:) 中初始化任何存储的属性,但看起来您似乎没有任何属性。存储的属性只能在其 属性 初始化程序 内联 中初始化。像这样具有可自定义存储属性的按钮是否仍然可以称为“系统”类型按钮也有争议。

另一件需要注意的事情是,由于 class 只有一个便利初始化器,它从它的 superclass 继承了所有初始化器,因此它是 self.init(type: type) 而不是 super.init(type: type),以及为什么不需要声明所需的初始化程序。