如何使用 属性 上的 didSet 更改 UIView 的背景颜色?

How to change backgroundColor of UIView with didSet on a property?

我有一个 UIView,它具有用枚举定义的不同状态。 当我改变状态时,我想更新它的 backgroundColor 属性。 没用。

 enum State {
        case lock 
        case unlock
        case done
    }

    @IBDesignable
    class DeviceView: UIView {

        var state:State = .lock  {

            didSet(newValue) {

            print("PRINT didSet \(newValue)")

                switch newValue {
                case .unlock:
                self.backgroundColor = green   
                }
                self.setNeedsDisplay()     
        }
    }


    func initDevice(type:Type) {
        self.state = state
    }

在我的 viewDidLoad 视图控制器中:

override func viewDidLoad() {
    device1View.initDevice(state: .lock)
    print("PRINT 1 \(device1View.state)")
}

稍后在另一个地方,我需要更改我的 DeviceView 的状态

print("PRINT 2 \(device1View.state)")
device1View.state = .unlock
print("PRINT new 3 \(device1View.state)")

结果:

PRINT didSet lock
PRINT 1 lock
PRINT 2 lock
PRINT didSet lock <--- ???
PRINT new 3 done

...等等我的背景颜色永远不会更新。

不明白为什么最后一个didSet是"lock"。应该是 "unlock" 不? 我想这就是我的背景颜色没有更新的原因。

class DeviceView: UIView {
    var state:State?  {
        didSet(newValue) {
        print("PRINT didSet \(newValue)")
            switch newValue {
            case .unlock:
            self.backgroundColor = green   
            }
        self.setNeedsDisplay()     
}   

这样试试。

您不需要将参数传递给 didSet 。状态本身已经是 didSet 中的新参数,所以你可以用这个更改 didSet 代码块;

didSet {

        print("PRINT didSet \(state)")

            switch state {
            case .unlock:
            self.backgroundColor = green   
            }
            self.setNeedsDisplay()     
    }