2017-06-29 132 views
0

我有一个用enum定义的不同状态的UIView。 当我改变状态时,我想更新它的backgroundColor属性。 它不起作用。如何使用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 

...等等我的ba ckgroundColor从不更新。

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

回答

1

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

didSet { 

     print("PRINT didSet \(state)") 

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

简单而有效,谢谢! – cmii

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

试试这个。