假设您有 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
???
//heyViewThePropertyIsChanged(nameof(compProp))
}
}
}
你如何强制视图:
import SwiftUI
struct ContentView: View {
@StateObject var viewModel: ViewModel
var body: some View {
VStack {
Text("\(viewModel.compProp)").font(.title)
}
.frame(minWidth: 320)
.toolbar {
Button(action: viewModel.maybeChange) {
Label("Maybe", systemImage: "gear.badge.questionmark")
}
}.padding()
}
}
反映这样的变化?
每个 ObservableObject 为此目的通过 objectWillChange 提供发布者。
class ViewModel: ObservableObject {
private var val = 42;
var compProp: Int {
return val
}
func maybeChange() {
if (Int.random(in: 0..<2) == 1) {
objectWillChange.send()
val += 1
}
}
}
这会重新创建与使用 Published 属性包装器获得的相同行为。
我会预见到为什么是“willChange”而不是“didChange”的问题: SwiftUI 中的数据要点