在 SwiftUI 中将数据从一个 ViewModel 传递到另一个?
Pass data from one ViewModel to another in SwiftUI?
我有一个带有名称列表的 ViewModel VM_App
,V_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。
我有一个带有名称列表的 ViewModel VM_App
,V_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。