我有一个用枚举定义的不同状态的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是“锁定”。应该“解锁”不? 我认为这就是为什么我的背景颜色没有更新的原因。
答案 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()
}
试试这样。