如何在属性上使用didSet更改UIView的backgroundColor?

时间:2017-06-29 12:17:54

标签: ios swift uiview enums didset

我有一个用枚举定义的不同状态的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

...等我的backgroundColor永远不会更新。

我不明白为什么最后的didSet是“锁定”。应该“解锁”不? 我认为这就是为什么我的背景颜色没有更新的原因。

2 个答案:

答案 0 :(得分:1)

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

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <style>

.wrap {
  display: flex;
}

.wrap2 {
  padding: 4px;
  margin: 20px;
  outline: 1px dashed;
  display: flex;
  flex-wrap: wrap;
  max-width: 280px;
}

.box {
  width: 40px;
  height: 40px;
  outline: 1px solid;
}

  </style>
</head>
<body>
<div class="wrap">
  <div class="wrap2">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
</div>
</body>
</html>

答案 1 :(得分:0)

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

试试这样。