我试图在Swift中向UIButton的子类添加double值
尝试了所有类型的inits并获取和设置选项,但我无法让它工作.
尝试了所有类型的inits并获取和设置选项,但我无法让它工作.
所以我从这开始
class CVSTButton : UIButton { var cvstPosition: Double required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") super.init(coder: aDecoder) } }
然后我试过:
class CVSTButton : UIButton { var cvstPosition: Double { get { return self.cvstPosition } set { self.cvstPosition = newValue } } required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") super.init(coder: aDecoder) } }
我在这里没有弄错….请帮忙……
使用Swift 3,根据您的需要,您可以选择以下七个代码段中的一个来解决您的问题.
1.使用自定义初始化程序创建UIButton子类
此解决方案允许您使用适当的属性值创建UIButton子类的实例.使用此解决方案,您只能以编程方式创建UIButton子类的实例.
import UIKit class 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") } }
用法:
import UIKit class 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.使用便捷初始化程序创建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) { // 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") } }
用法:
import UIKit class 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.使用init(frame:CGRect)初始化程序创建UIButton子类
使用此解决方案,您只能以编程方式创建UIButton子类的实例.
import UIKit class 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") } }
用法:
import UIKit class 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.使用init?(coder aDecoder:NSCoder)初始化程序创建UIButton子类
使用此解决方案,您可以从Storyboard创建UIButton子类的实例.
import UIKit class 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 } }
用法:
import UIKit class ViewController: UIViewController { @IBOutlet weak var button: CustomButton! override func viewDidLoad() { super.viewDidLoad() print(button.myValue) // prints 0 } }
5.使用init(frame:CGRect)和init?(编码器aDecoder:NSCoder)初始化器创建UIButton子类
使用此解决方案,您可以以编程方式或从Storyboard创建UIButton子类的实例.
import UIKit class 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 } }
作为先前解决方案的替代方案,您可以在初始化程序之外为属性分配初始值.
import UIKit class 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.使用具有可选类型的属性创建UIButton子类
如果在创建按钮时不希望/不能为属性设置默认值,则必须将属性类型设置为可选.
import UIKit class 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 } }