当与另一个选项卡交互时,如何使SwiftUI选项卡视图重新加载?

当与另一个选项卡交互时,如何使SwiftUI选项卡视图重新加载?,swift,swiftui,xcode12,swiftui-tabview,Swift,Swiftui,Xcode12,Swiftui Tabview,我试着四处看看状态和可观察对象的解决方案,但我需要一些帮助 基本上,我在ContentView中有一个选项卡视图,其中有两个选项卡,比如subview1和subview2。这两个子视图还包含另一个名为cellView的视图。当cellView在一个子视图中被更改时,我想重新绘制另一个子视图 布局示例: TabView + + | | | | S

我试着四处看看状态和可观察对象的解决方案,但我需要一些帮助

基本上,我在ContentView中有一个选项卡视图,其中有两个选项卡,比如subview1和subview2。这两个子视图还包含另一个名为cellView的视图。当cellView在一个子视图中被更改时,我想重新绘制另一个子视图

布局示例:

              TabView
             +         +
             |         |
             |         |
Subview1  <--+         +--> Subview2
    +                        +
    |                        |
    v                        v
  CellView                  CellView
TabView
+         +
|         |
|         |
子视图1子视图2
+                        +
|                        |
v v
手机视图手机视图

我觉得这应该很容易,但我不能让它与@State vars或任何东西一起工作。

observegeobject
是一个很好的工具。您可以创建一个
observateObject
,并将其归子视图和单元视图的共同祖先所有

以下是一个基本示例:

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)
    }
}
我将
observeObject
作为属性显式地传递给每个视图,但您也可以使用
.environmentObject
来完成此操作

请注意,这不是唯一的解决方案。您也可以通过共享的
@状态
绑定
来实现这一点,但是这些绑定看起来可能不可靠,因为它们在视图层次结构的多个层次中传递,我在这里介绍的解决方案是稳定的,并且是在SwiftUI中解决此类问题的一种非常常见的方法