【问题标题】:SwiftUI - Change an @Published var from one view and have it reflect on anotherSwiftUI - 从一个视图更改 @Published 变量并让它反映在另一个视图上
【发布时间】:2021-08-11 01:47:27
【问题描述】:

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

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

内容视图:

struct ContentView: View {

      @ObservedObject var exercises: ExerciseSelector = ExerciseSelector()

单独的类:

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 类中创建一个两个视图都可以读取的单例来解决这个问题。

static let shared = ExerciseSelector()

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

有没有更好的方法来完成这一切,或者单例方法是最好的方法?

【问题讨论】:

  • 哈哈,你把“单一事实来源”放在引号里让我相信这在 SwiftUI 中很常见!不过谢谢!我将尝试弄清楚如何在其中应用@EnvironmentObject,但很高兴知道我并没有严重破坏任何东西!是否要将您的回复添加为答案以便我接受?
  • 'static let shared = ExerciseSelector()" 是最好的方法。否则你必须管理环境对象的注入。这工作得很好,可以预测,并且完全符合 MVVM。跨度>
  • @Yrb 静态属性当然是一种方法,但我认为@EnvironmentObject 策略更类似于 SwiftUI 的假定 被使用。
  • 我对@9​​87654327@ 的问题是注入。你最终需要一个两步的过程来使用它,我发现它有时有点不稳定。我承认自 5.3 以来没有使用过它。我同意认为@EnvironmentObject 是首选方法,但@ObservableObject 勾选了所有相同的框。

标签: swift mvvm swiftui


【解决方案1】:

如果 ExerciseSelector 及其数组是您的“单一事实来源”,那么您需要执行您已经完成的操作,以便两个视图可以使用相同的实例。另一种选择是使用@EnvironmentObject,这是实现基本相同的不同方式。例如,请参阅this article 以了解 EnvironmentObject

【讨论】:

    猜你喜欢
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多