how to init a UIButton subclass?
With Swift 3, according to your needs, you may choose one of the seven following code snippets to solve your problem.
1. Create your UIButton
subclass with a custom initializer
This solution allows you to create instances of your UIButton
subclass with the appropriate value for your property. With this solution, you can only create instances of your UIButton subclass programmatically.
import UIKitclass CustomButton: UIButton { var myValue: Int required init(value: Int = 0) { // set myValue before super.init is called self.myValue = value super.init(frame: .zero) // set other operations after super.init, if required backgroundColor = .red } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }}
Usage:
import UIKitclass ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let button = CustomButton(value: 0) // let button = CustomButton() // also works button.setTitle("Hello", for: .normal) // auto layout 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) // prints 0 }}
2. Create your UIButton
subclass with a convenience initializer
This solution allows you to create instances of your UIButton
subclass with the appropriate value for your property. With this solution, you can only create instances of your UIButton
subclass programmatically.
import UIKitclass CustomButton: UIButton { var myValue: Int convenience init(squareOf value: Int) { self.init(value: value * value) } required init(value: Int = 0) { // set myValue before super.init is called self.myValue = value super.init(frame: .zero) // set other operations after super.init, if required backgroundColor = .red } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }}
Usage:
import UIKitclass ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let button = CustomButton(squareOf: 10) // let button = CustomButton(value: 100) // also works button.setTitle("Hello", for: .normal) // auto layout 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) // prints 100 }}
3. Create your UIButton
subclass with init(frame: CGRect)
initializer
With this solution, you can only create instances of your UIButton
subclass programmatically.
import UIKitclass CustomButton: UIButton { var myValue: Int override init(frame: CGRect) { // set myValue before super.init is called self.myValue = 0 super.init(frame: frame) // set other operations after super.init, if required backgroundColor = .red } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }}
Usage:
import UIKitclass ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let button = CustomButton(frame: .zero) //let button = CustomButton() // also works button.setTitle("Hello", for: .normal) // auto layout 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) // prints 0 }}
4. Create your UIButton
subclass with init?(coder aDecoder: NSCoder)
initializer
With this solution, you can create instances of your UIButton
subclass from Storyboard.
import UIKitclass CustomButton: UIButton { var myValue: Int required init?(coder aDecoder: NSCoder) { // set myValue before super.init is called self.myValue = 0 super.init(coder: aDecoder) // set other operations after super.init, if required backgroundColor = .red }}
Usage:
import UIKitclass ViewController: UIViewController { @IBOutlet weak var button: CustomButton! override func viewDidLoad() { super.viewDidLoad() print(button.myValue) // prints 0 }}
5. Create your UIButton
subclass with init(frame: CGRect)
and init?(coder aDecoder: NSCoder)
initializers
With this solution, you can create instances of your UIButton
subclass programmatically or from Storyboard.
import UIKitclass CustomButton: UIButton { var myValue: Int override init(frame: CGRect) { // set myValue before super.init is called self.myValue = 0 super.init(frame: frame) // set other operations after super.init, if required backgroundColor = .red } required init?(coder aDecoder: NSCoder) { // set myValue before super.init is called self.myValue = 0 super.init(coder: aDecoder) // set other operations after super.init if required backgroundColor = .red }}
6. Create your UIButton
subclass with a default property value for your property
As an alternative to the previous solutions, you can assign an initial value to your property outside of the initializers.
import UIKitclass CustomButton: UIButton { var myValue: Int = 0 override init(frame: CGRect) { super.init(frame: frame) // set other operations after super.init, if required backgroundColor = .red } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) // set other operations after super.init if required backgroundColor = .red }}
7. Create your UIButton
subclass with your property having an optional type
If you don't want to / can't set a default value to your property when your button is created, you must set your property type as an optional.
import UIKitclass CustomButton: UIButton { var myValue: Int? = nil override init(frame: CGRect) { super.init(frame: frame) // set other operations after super.init, if required backgroundColor = .red } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) // set other operations after super.init if required backgroundColor = .red }}
Two things you need there -- (1) cvstPosition
need an initial value, either in the declaration or in the init
before you call super.init()
. (2) That call to fatalError
is put in so you don't forget to implement the initializer -- it's basically an on-purpose crash. Delete!
Setting initial value in the declaration, no need for an init
:
class CVSTButton : UIButton { var cvstPosition: Double = 0}
Or setting the initial value in the initializer:
class CVSTButton : UIButton { var cvstPosition: Double required init(coder aDecoder: NSCoder) { cvstPosition = 0 super.init(coder: aDecoder) }}
Swift >= 2.2:
Just inherit from UIButton, and your subclass becomes with type .Custom
default.
Swift 2:
convenience init(type buttonType: UIButtonType) { super.init(frame: CGRectZero) // this button be automatically .Custom}
Swift:
override class func buttonWithType(buttonType: UIButtonType) -> AnyObject { let button = super.buttonWithType(buttonType) as! UIButton // your default code return button}