ObservableObject
是一个很好的工具。您可以制作一个ObservableObject
并将其归子视图和单元格视图的共同祖先所有。
这是一个基本示例:
class StateManager : ObservableObject {
@Published var counter = 0
}
struct ContentView : View {
@ObservedObject var state = StateManager()
var body: some View {
TabView {
Page1(state: state).tabItem { Text("Tab 1") }
Page2(state: state).tabItem { Text("Tab 2") }
}
}
}
struct Page1 : View {
@ObservedObject var state : StateManager
var body: some View {
Subview(state: state)
}
}
struct Subview : View {
@ObservedObject var state : StateManager
var body : some View {
Button(action: { state.counter += 1 }) {
Text("Increment: \(state.counter)")
}.foregroundColor(.purple)
}
}
struct Page2 : View {
@ObservedObject var state : StateManager
var body: some View {
Subview2(state: state)
}
}
struct Subview2 : View {
@ObservedObject var state : StateManager
var body : some View {
Button(action: { state.counter -= 1 }) {
Text("Decrement: \(state.counter)")
}.foregroundColor(.red)
}
}
我将ObservableObject
显式作为属性传递给每个视图,但您也可以考虑使用.environmentObject
.
请注意,这不是唯一的解决方案。您也可以使用共享的@State
and来完成此操作Bindings
,但它们看起来可能不可靠,因为它们通过视图层次结构的多个级别传递,而我在这里展示的解决方案是稳定的,并且是解决此类问题的一种极其常见的方法在 SwiftUI 中。