有没有办法在 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)
,以及为什么不需要声明所需的初始化程序。
我下面有这个自定义按钮 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)
,以及为什么不需要声明所需的初始化程序。