在 SwiftUI 中将数据从一个 ViewModel 传递到另一个?

Pass data from one ViewModel to another in SwiftUI?

我有一个带有名称列表的 ViewModel VM_AppV_App 中的另一个视图 V_NamesList 应该显示这些名称。为此,我将列表从 VM_App 传递到 VM_NamesList,但视图在编辑名称时被重绘。

VM_App

class VM_App: ObservableObject {
    @Published var names: [String] = [
        "Tobias",
        "Jonathan",
        ""
    ]
}

V_App

struct V_App: View {
    @ObservedObject var vm: VM_App = VM_App()

    var body: some View {
        VStack {
            V_NamesList(
                VM_NamesList(names: $vm.names)
            )
        }
    }
}

VM_NamesList

class VM_NamesList: ObservableObject {
    @Binding var names: [String]
    
    init(names: Binding<[String]>) {
        self._names = names
    }
}

V_NamesList

struct V_NamesList: View {
    @ObservedObject var vm: VM_NamesList
    
    init(_ vm: VM_NamesList) {
        self.vm = vm
    }
    
    var body: some View {
        ForEach(Array(vm.names.enumerated()), id: \.element) { (i, name) in
            TextField("New Player", text: $vm.names[i])
        }
    }
}

在 SwiftUI 上,View 将跟踪您的 ObservableObject 是否会发生变化。因此,如果您不想在数据更改后刷新视图,请不要跟踪 names 更改。

class VM_App: ObservableObject {
    var names: [String] = [
        "Tobias",
        "Jonathan",
        ""
    ]
}

struct V_App: View {
    @ObservedObject var vm: VM_App = VM_App()

    var body: some View {
        VStack {
            V_NamesList(
                VM_NamesList(names: $vm.names)
            )
        }
    }
}

仍然,因为您有 @Binding,它会为 VM_App 设置名称,但会为您的 V_App.

保持静默更改

你能描述一下你想做什么吗?

如果要传递视图模型,可以在两个视图中使用相同的视图模型:

struct V_NamesList: View {
    @ObservedObject var vm: VM_App

    var body: some View {
        ForEach(Array(vm.names.enumerated()), id: \.element) { (i, name) in
            TextField("New Player", text: $vm.names[i])
        }
    }
}

并且您可以从父级传递视图模型:

struct V_App: View {
    @StateObject var vm: VM_App = VM_App()

    var body: some View {
        V_NamesList(vm: vm)
    }
}

创建和存储可观察对象视图模型时需要使用@StateObject。