2017-06-29 136 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()  
} 

試試這個。