与另一个选项卡交互时如何使 SwiftUI 选项卡视图重新加载?
How to cause a SwiftUI tabview to reload when another tab is interacted with?
我已经尝试查看 State 和 ObservableObject 解决方案,但我需要一些帮助。
基本上我的 ContentView 中有一个带有 2 个选项卡的 tabView,比如 subview1 和 subview2。这两个子视图还包含另一个名为 cellView 的视图。当在一个子视图中更改 cellView 时,我想重绘另一个子视图。
布局示例:
TabView
+ +
| |
| |
Subview1 <--+ +--> Subview2
+ +
| |
v v
CellView CellView
我觉得它应该很容易,但我无法使用@State vars 或其他任何东西。
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
和 Bindings
来完成此操作,但是看起来它们 可能 不可靠,因为它们要通过视图层次结构的多个级别,我在这里展示的解决方案是稳定的,并且是在 SwiftUI 中解决此类问题的一种极其常见的方法。
我已经尝试查看 State 和 ObservableObject 解决方案,但我需要一些帮助。
基本上我的 ContentView 中有一个带有 2 个选项卡的 tabView,比如 subview1 和 subview2。这两个子视图还包含另一个名为 cellView 的视图。当在一个子视图中更改 cellView 时,我想重绘另一个子视图。
布局示例:
TabView
+ +
| |
| |
Subview1 <--+ +--> Subview2
+ +
| |
v v
CellView CellView
我觉得它应该很容易,但我无法使用@State vars 或其他任何东西。
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
和 Bindings
来完成此操作,但是看起来它们 可能 不可靠,因为它们要通过视图层次结构的多个级别,我在这里展示的解决方案是稳定的,并且是在 SwiftUI 中解决此类问题的一种极其常见的方法。