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