【发布时间】: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 的假定 被使用。 -
我对@987654327@ 的问题是注入。你最终需要一个两步的过程来使用它,我发现它有时有点不稳定。我承认自 5.3 以来没有使用过它。我同意认为
@EnvironmentObject是首选方法,但@ObservableObject勾选了所有相同的框。