【问题标题】:Overriding isHighlighted still changes UIControlState - why?覆盖 isHighlighted 仍然会改变 UIControlState - 为什么?
【发布时间】:2018-08-13 18:09:16
【问题描述】:

在一个UIControl中,如果我重写isHighlighted来设置一个私有的_isHighlighted属性,然后检查控件的state看它是否包含.highlighted,状态仍然准确地反映了变化。请参阅下面的代码。

我的问题是,这怎么可能?我从不打电话给super.isHighlighted 或操纵状态属性。 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

【问题讨论】:

    标签: swift uicontrol uicontrolstate


    【解决方案1】:

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

    很好的解释!让我们尝试在 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 demostrandum。

    【讨论】:

    • 是的。有趣的。这对尝试实现我自己的自定义状态(即stackoverflow.com/questions/2856042/…)有影响。我确实在做。看起来在状态之上没有真正需要自定义状态位掩码!哎呀。我想我需要更改一堆代码:-(
    猜你喜欢
    • 2019-10-11
    • 2012-09-26
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    相关资源
    最近更新 更多