SwiftUI - 从一个视图更改 @Published var 并让它反映在另一个视图中

SwiftUI - Change an @Published var from one view and have it reflect on another

我是 SwiftUI 和 MVVM 的新手,围绕 @Published 的整个过程对我来说仍然没有完全意义。

在我的 contentView 中,我有一个从采用 ObservedObject 协议的 class 读取的可观察对象。

内容视图:

struct ContentView: View {

      @ObservedObject var exercises: ExerciseSelector = ExerciseSelector()

分开 Class:

class ExerciseSelector: ObservableObject {

      @Published var activeExercises : [SelectedExercises] = []

在我的应用程序的另一个页面(TabView 中的另一个选项卡)上,我有一个应该更改 'activeExercises' 数组的按钮。

struct NewRoutine: View {

let exerciseSelector = ExerciseSelector()

...

//Button Function
func printThings() {

    exerciseSelector.select(random: true)

我已经在其中放置了打印语句以确认它确实确实更改了数组(确实如此),但它仍然没有显示在第一页上。我的猜测是我通过在第二页上初始化另一个 ExerciseSelector 实例搞砸了一些事情,并且它在技术上与 ContentView 观察到的不同。所以我试图通过在 ExerciseSelector class 中创建一个两个视图都可以读取的单例来解决这个问题。

static let shared = ExerciseSelector()

这可行,但我觉得这并不是真正“正确”的方法。

是否有更好的方法来实现这一切,或者单例方法是最好的方法吗?

如果 ExerciseSelector 及其数组是您的“单一事实来源”,那么您需要做一些您已经做过的事情,以便两个视图可以使用相同的实例。另一种选择是使用@EnvironmentObject,这是一种实现基本相同的不同方式。有关 EnvironmentObject

的示例,请参阅 this article