我的 iOS 应用程序中的 UI 非常复杂,以至于当我应该启用/禁用/隐藏/显示某些按钮或 View 时,有时会感到困惑。经过一番思考,我认为该应用程序只有三种状态: 空闲 、 正在录制 和 正在播放 。
所以我创建了一个枚举类型 AppState
的计算属性变量,我希望通过它观察状态变化,以便我可以相应地更新 UI。一些 UI 更改包括显示或禁用按钮以及从其 super View 中删除自定义 UIView
对象。
var curState : AppState = .Idling {
didSet {
if newValue != oldValue {
updateUI() // ?? better here?
}
}
willSet(newValue) {
updateUI() // ?? good here?
}
set {
updateUI() // ?? good here
}
}
我一直在使用上面的
set
来调用updateUI()
方法,效果很好,但是我想知道三个观察者哪个更好?我没有尝试过 willSet
或 didSet
,但我倾向于使用 didSet
,因为我可以在更新 UI 之前比较 oldValue
和 newValue
。我可能是错的,我很乐意在这里听取建议。谢谢!
最佳答案
属性可以是两种类型:
get
和 set
定义。如果您想知道何时发生更改,您可以使用 willSet
和 didSet
。 get
和可选的 set
。如果您想收到更改通知,那么 set
就是这样做的地方。 不能混合搭配,即存储的属性不能有
get
或 set declaration, and computed properties can't have a
willSet or
didSet` 声明。在您的情况下,您的
appState
看起来像是一个存储变量。因此,确实,放置观察者逻辑的正确位置是在 willSet
或 didSet
中。有一些权衡:willSet
,您的 newValue
必须手动传递给任何需要它的函数。 didSet
,您的新值是存储属性本身的值,所有方法都可以通过 self
访问它,因此无需手动传递它。然而,这是以暂时使您的对象状态不一致为代价的(因为已经设置了一个值,但它的更新效果尚未发生),这可能会导致您需要注意的细微状态错误。 关于ios - Swift/iOS : using computed property to trigger UI update, 哪个更好 : didSet, willSet 或 set?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38962596/