[英]How to pass data between ViewModels in SwiftUI
我有這個用例,我有一個父視圖和一個子視圖。 兩個視圖都有自己對應的 ViewModel。
父視圖:
struct ParentView: View {
@StateObject var parentViewModel = ParentViewModel()
var body: some View {
NavigationView {
List {
TextField("Add Name", text: $parentViewModel.newListName)
NavigationLink(destination: ChildView()) {
Label("Select Products", systemImage: K.ListIcons.productsNr)
}
}
}
}
父視圖模型:
class AddListPopoverViewModel: ObservableObject {
@Published var newListName: String = ""
func saveList() {
// some logic to save to CoreData, method would be called via a button
// how do I reference "someString" from ChildViewModel in this ViewModel?
}
}
子視圖:
struct ChildView: View {
@StateObject var childViewModel = ChildViewModel()
var body: some View {
NavigationView {
List{
Text("Some element")
.onTapGesture {
childViewModel.alterData()
}
}
}
}
}
子視圖模型:
class ChildViewModel: ObservableObject {
@Published var someString: String = ""
func alterData() {
someString = "Toast"
}
}
我現在的問題是,如何將“someString”的新值從 ChildViewModel 傳遞到 ParentViewModel,以便用它做一些進一步的事情? 我嘗試在 ParentViewModel 中創建@StateObject var childViewModel = ChildViewModel()
引用,但這顯然不起作用,因為這將創建 ChildViewModel 的新實例,因此不知道對“someString”所做的更改
對於這種情況,您很可能會使用綁定:
struct ChildView: View {
@Binding var name: String
var body: some View {
NavigationView {
List{
Text("Some element")
.onTapGesture {
name = "Altered!"
}
}
}
}
}
在父母中:
struct ParentView: View {
@StateObject var parentViewModel = ParentViewModel()
var body: some View {
NavigationView {
List {
TextField("Add Name", text: $parentViewModel.newListName)
NavigationLink(destination: ChildView(name: $parentViewModel.newListName)) {
Label("Select Products", systemImage: K.ListIcons.productsNr)
}
}
}
}
另外,我認為您可以從ChildView
中刪除NavigationView
視圖。 擁有它ParentView
就足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.