如何让SwiftUI View感知ViewModel计算属性的变化?
让SwiftUI视图响应ViewModel计算属性的变化
要让ContentView能实时反映compProp的变化,有两种简洁的实现方式:
方式一:手动发送更新通知
ObservableObject协议自带objectWillChange发布者,在修改计算属性的依赖值后,手动发送信号就能触发视图更新。修改后的ViewModel代码如下:
import Foundation class ViewModel: ObservableObject { private var val = 42 var compProp: Int { return val } func maybeChange() { if Int.random(in: 0..<2) == 1 { val += 1 objectWillChange.send() // 通知视图属性即将更新 } } }
当val变化后,调用objectWillChange.send()会让所有绑定该ViewModel的视图(比如用@StateObject关联的ContentView)重新计算body,从而读取到compProp的最新值。
方式二:利用@Published自动触发通知
如果计算属性的依赖值可以标记为@Published,就能省去手动发送通知的步骤。给私有变量val加上@Published修饰符,它的变化会自动触发ViewModel的更新通知:
import Foundation class ViewModel: ObservableObject { @Published private var val = 42 var compProp: Int { return val } func maybeChange() { if Int.random(in: 0..<2) == 1 { val += 1 // @Published会自动发送更新信号,无需额外代码 } } }
这种方式更简洁,适合计算属性仅依赖单个@Published变量的场景。当val被修改时,@Published会自动通知视图重新渲染,此时compProp会返回最新的val值。
内容的提问来源于stack exchange,提问作者eggor
相关产品推荐
相关产品推荐

