一尘不染

Swift-覆盖setSelected的UIButton

swift

我在Swift中制作了一个UIButton子类,以在选择时执行自定义绘图和动画

Swift - (void)setSelected:(BOOL)selected中的ObjC中的覆盖相当于什么?

我试过了

override var selected: Bool

所以我可以实现一个观察者,但是我得到

Cannot override with a stored property 'selected'


阅读 379

收藏
2020-07-07

共1个答案

一尘不染

像其他提到的一样,您可以使用它willSet来检测更改。但是,在替代中,您不需要将值分配给super,而只是观察现有的更改。

您可以从以下游乐场观察到几件事:

  1. 覆盖的属性willSet/didSet仍会为调用super get/set。您可以知道,因为状态从.normal变为.selected
  2. willSet和didSet被称为甚至当值没有改变,所以你可能会想要做比较的价值selected无论是newValuewillSetoldValuedidSet确定是否要动画。
    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.
2020-07-07