2017-06-29 9 views
0

私は、enumで定義された異なる状態のUIViewを持っています。 状態を変更すると、backgroundColorプロパティを更新したいと思います。 動作しません。 viewDidLoadで私のビューコントローラでプロパティの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 
    } 

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 

...など私のバckgroundColorは更新されません。

なぜ最後のセットが「ロック」なのか分かりません。それはいいえ "ロックを解除する必要がありますか? 私の背景色が更新されないのはその理由だと思います。

答えて

1

didSetにパラメータを渡す必要はありません。状態そのものは既にdidSetの新しいパラメータですので、これでSet codeブロックを変更することができます。

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()  
} 

このようにしてください。

関連する問題