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

在SwiftUI中将数据从一个ViewModel传递到另一个ViewModel?,swift,mvvm,swiftui,viewmodel,Swift,Mvvm,Swiftui,Viewmodel,我有一个ViewModelVM_App和一个名字列表,另一个视图V_NamesList在V_App里面,应该显示这些名字。为此,我将列表从VM_App传递到VM_NamesList,但在编辑名称时视图会被重新绘制 虚拟机应用程序 class VM_App: ObservableObject { @Published var names: [String] = [ "Tobias", "Jonathan",

我有一个ViewModel
VM_App
和一个名字列表,另一个视图
V_NamesList
V_App
里面,应该显示这些名字。为此,我将列表从
VM_App
传递到
VM_NamesList
,但在编辑名称时视图会被重新绘制

虚拟机应用程序

class VM_App: ObservableObject {
    @Published var names: [String] = [
        "Tobias",
        "Jonathan",
        ""
    ]
}
V_应用程序

虚拟机名称列表

class VM_NamesList: ObservableObject {
    @Binding var names: [String]
    
    init(names: Binding<[String]>) {
        self._names = names
    }
}
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上,视图将跟踪您的ObserveObject是否会更改。因此,如果您不想在数据更改后刷新视图,只需不跟踪
名称的更改即可

classvm\u应用程序:observeObject{
变量名称:[字符串]=[
“托拜厄斯”,
“乔纳森”,
""
]
}
结构V_应用程序:视图{
@ObservedObject变量vm:vm_App=vm_App()
var body:一些观点{
VStack{
V_名称列表(
虚拟机名称列表(名称:$VM.names)
)
}
}
}

尽管如此,因为您有
@Binding
,它将设置
VM\u应用程序的名称
,但会为您的
V\u应用程序

保持它的不变。您能描述一下您正在尝试做的事情吗

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

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。

在视图模型中使用
@Published
而不是
@Binding
。我尝试使用自己的视图模型将列表逻辑移到自己的视图中,@StateObject完成了这一操作,谢谢:)
struct V_App: View {
    @StateObject var vm: VM_App = VM_App()

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