簡體   English   中英

如何在 SwiftUI 中的 ViewModel 之間傳遞數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM