Swift – 重写UButton setSelected

我在Swift中创build一个UIButton子类,以便在select时执行自定义绘图和animation

在重写的Swift中等效于什么- (void)setSelected:(BOOL)selected在ObjC中- (void)setSelected:(BOOL)selected

我试过了

override var selected: Bool

所以我可以实现一个观察员,但我明白了

Cannot override with a stored property 'selected'

像其他人提到的,您可以使用willSet来检测更改。 但是,在重写中,您不需要将该值分配给super,只是观察现有的更改。

你可以在下面的操场上观察几件事情:

  1. 覆盖willSet/didSet的属性仍然会调用get/set超级属性。 你可以说因为状态从.selected
  2. 即使当值不变时,也会调用willSet和didSet,因此您可能需要将selected的值与willSet newValuewillSet oldValue进行didSet以确定是否进行animation制作。
 import UIKit class MyButton : UIButton { override var isSelected: Bool { willSet { print("changing from \(isSelected) to \(newValue)") } didSet { print("changed from \(oldValue) to \(isSelected)") } } } let button = MyButton() button.state == .normal button.isSelected = true // Both events fire on change. button.state == .selected button.isSelected = true // Both events still fire. 

你会像这样做:

 class MyButton : UIButton { // ... override var isSelected: Bool { willSet(newValue) { super.isSelected = newValue; // do your own business here... } } // ... } 

尝试这个

 override public var selected: Bool { willSet(selectedValue) { self.selected = selectedValue // Do whatever you want } } 

创buildIBAction和检查buttonselect或不是在迅速的语言。

 @IBAction func favoriteButtonAction(sender: UIButton) { // Save Data sender.selected = !sender.selected; if (sender.selected) { NSLog(" Not Selected"); } else { NSLog(" Selected"); } }