覆盖 isHighlighted 仍然会改变 UIControlState - 为什么?
Overriding isHighlighted still changes UIControlState - why?
在UIControl
中,如果我覆盖isHighlighted
设置私有_isHighlighted
属性,然后检查控件的state
看是否包含 .highlighted
,状态仍然准确地反映了变化。请参阅下面的代码。
我的问题是,这怎么可能?我从不调用 super.isHighlighted
或操纵状态 属性。 state
是一个 OptionSet
,必须将 .highlighted
属性 插入到集合中,据我所知,如果我覆盖,则不会或不应该发生属性。
我能想到的唯一其他解释是 state
实际上是根据其他属性(即 isSelected
、isEnabled
等)计算得出的 属性
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
The only other explanation I can think of is that state is actually a computed property based off other properties (i.e. isSelected, isEnabled, etc.)
很好的解释!让我们尝试在 getter 中记录(打印)以查看是否正确:
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
Quod erat demonstrandum.
在UIControl
中,如果我覆盖isHighlighted
设置私有_isHighlighted
属性,然后检查控件的state
看是否包含 .highlighted
,状态仍然准确地反映了变化。请参阅下面的代码。
我的问题是,这怎么可能?我从不调用 super.isHighlighted
或操纵状态 属性。 state
是一个 OptionSet
,必须将 .highlighted
属性 插入到集合中,据我所知,如果我覆盖,则不会或不应该发生属性。
我能想到的唯一其他解释是 state
实际上是根据其他属性(即 isSelected
、isEnabled
等)计算得出的 属性
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
The only other explanation I can think of is that state is actually a computed property based off other properties (i.e. isSelected, isEnabled, etc.)
很好的解释!让我们尝试在 getter 中记录(打印)以查看是否正确:
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
Quod erat demonstrandum.