在SwiftUI中将数据从一个ViewModel传递到另一个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",
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)
}
}