使用Swift 3,您可以根据需要选择以下七个代码片段之一来解决问题。
1. 使用自定义初始化程序创建UIButton
子类
此解决方案允许您创建具有适当属性值的UIButton
子类实例。使用此解决方案,您只能通过编程方式创建UIButton
子类实例。
import UIKit
class CustomButton: UIButton {
var myValue: Int
required init(value: Int = 0) {
self.myValue = value
super.init(frame: .zero)
backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
使用方法:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = CustomButton(value: 0)
button.setTitle("Hello", for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)
button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
print(button.myValue)
}
}
2. 使用便利初始化方法创建您的UIButton
子类
这个解决方案可以让您创建具有适当属性值的UIButton
子类实例。通过这种方法,您只能以编程方式创建UIButton
子类的实例。
import UIKit
class CustomButton: UIButton {
var myValue: Int
convenience init(squareOf value: Int) {
self.init(value: value * value)
}
required init(value: Int = 0) {
self.myValue = value
super.init(frame: .zero)
backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
使用方法:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = CustomButton(squareOf: 10)
button.setTitle("Hello", for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)
button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
print(button.myValue)
}
}
3. 使用init(frame: CGRect)
初始化器创建你的UIButton
子类
使用这种解决方案,你只能通过编程方式创建你的UIButton
子类的实例。
import UIKit
class CustomButton: UIButton {
var myValue: Int
override init(frame: CGRect) {
self.myValue = 0
super.init(frame: frame)
backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
使用方法:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = CustomButton(frame: .zero)
button.setTitle("Hello", for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)
button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
print(button.myValue)
}
}
4. 使用init?(coder aDecoder: NSCoder)
初始化器来创建自己的UIButton
子类
采用这种方法,你可以在Storyboard中创建你的UIButton
子类实例。
import UIKit
class CustomButton: UIButton {
var myValue: Int
required init?(coder aDecoder: NSCoder) {
self.myValue = 0
super.init(coder: aDecoder)
backgroundColor = .red
}
}
使用方法:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: CustomButton!
override func viewDidLoad() {
super.viewDidLoad()
print(button.myValue)
}
}
5. 使用init(frame: CGRect)
和 init?(coder aDecoder: NSCoder)
初始化方法创建你的UIButton
子类
通过这种解决方案,你可以通过编写代码或从Storyboard中创建实例来使用你的UIButton
子类。
import UIKit
class CustomButton: UIButton {
var myValue: Int
override init(frame: CGRect) {
self.myValue = 0
super.init(frame: frame)
backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {
self.myValue = 0
super.init(coder: aDecoder)
backgroundColor = .red
}
}
6. 创建一个UIButton
子类,为你的属性设置一个默认属性值
除了前面提到的解决方案外,你还可以在初始化器之外给属性赋一个初始值。
import UIKit
class CustomButton: UIButton {
var myValue: Int = 0
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
backgroundColor = .red
}
}
7. 使用可选类型创建UIButton
的子类,并设置属性为可选类型
如果您不想或不能在创建按钮时为属性设置默认值,则必须将属性类型设置为可选类型。
import UIKit
class CustomButton: UIButton {
var myValue: Int? = nil
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .red
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
backgroundColor = .red
}
}
CustomButton(frame: CGRect(x: 100, y: 300, width: 200, height: 50))
而不是CustomButton(frame: .zero)
和自动布局,这样会更清晰。 - paulo62