覆盖isHighlighted仍会更改UIControlState-为什么?

时间:2018-08-13 18:09:16

标签: swift uicontrol uicontrolstate

UIControl中,如果我覆盖isHighlighted以设置私有_isHighlighted属性,然后检查控件的state以查看其是否包含.highlighted ,状态仍能准确反映变化。参见下面的代码。

我的问题是,这怎么可能?我从不调用super.isHighlighted或操纵state属性。 state是一个OptionSet,必须在集合中插入.highlighted属性,根据我的判断,如果我重写该属性,则不会发生或应该不会发生。

我能想到的唯一其他解释是state实际上是基于其他属性(即isSelectedisEnabled等)的计算属性

class MyControl: UIControl {

    private var _isHighlighted: Bool = false

    override var isHighlighted: Bool {
        get { return self._isHighlighted }
        set { self._isHighlighted = newValue }
    }

}


let myControl = MyControl()
myControl.isHighlighted = true
myControl.state.contains(.highlighted) // returns true

1 个答案:

答案 0 :(得分:2)

  

我能想到的唯一其他解释是,状态实际上是基于其他属性(即isSelected,isEnabled等)的计算属性。

很好的解释!让我们尝试在吸气剂中记录(打印)以查看是否正确:

class MyControl: UIControl {
    private var _isHighlighted: Bool = false
    override var isHighlighted: Bool {
        get { print("getting"); return self._isHighlighted }
        set { self._isHighlighted = newValue }
    }
}
let myControl = MyControl()
myControl.isHighlighted = true
print("about to check state")
myControl.state.contains(.highlighted)
print("checked state")

这是日志:

about to check state
getting
checked state

Quat erat演示。