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

问题描述

我已经尝试查看 State 和 ObservableObject 解决方案,但我需要一些帮助。

本质上,我的 ContentView 中有一个 tabView,其中有 2 个选项卡,比如 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 执行此操作。

请注意,这不是解决此问题的唯一解决方案。您也可以使用共享的 @StateBindings 来实现这一点,但它们看起来可能不可靠,因为它们通过视图层次结构的多个级别,其中我在这里展示的解决方案是稳定的,是在 SwiftUI 中解决此类问题的一种极其常见的方法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...