簡體   English   中英

如何在 SwiftUI 中的兩個視圖模型之間共享已發布的 model?

[英]How to share published model between two view models in SwiftUI?

我正在嘗試在兩個不同的視圖模型中訪問相同的共享 model。 兩個關聯視圖都需要訪問 model 視圖中的 model 並需要編輯 model。 所以我不能只使用 EnvironmentObject 來訪問 model。

我可以通過視圖將 model 傳遞給視圖 model,但這不會使兩個 model 版本保持同步。 有什么東西可以像綁定一樣工作嗎? 因為通過綁定我可以訪問 model 但它不會在此視圖中發布更改。

簡化示例:

NavigationView 中的第一個視圖與相鄰視圖二:

struct ContentView1: View {
    @StateObject var contentView1Model = ContentView1Model()
    var body: some View {
        NavigationView {
            VStack{
                TextField("ModelName", text: $contentView1Model.model.name)
                NavigationLink(destination: ContentView2(model: contentView1Model.model)){
                    Text("ToContentView2")
                }
            }
        }
    }
}

class ContentView1Model: ObservableObject {
    @Published var model = Model()
    //Some methods that modify the model
}

需要訪問 Model 的相鄰視圖 2:

struct ContentView2: View {
    @StateObject var contentView2Model: ContentView2Model
    
    init(model: Model) {
        self._contentView2Model = StateObject(wrappedValue: ContentView2Model(model: model))
    }
    
    var body: some View {
        TextField("ModelName", text: $contentView2Model.model.name)
    }
}

class ContentView2Model: ObservableObject {
    
    @Published var model: Model // Tried binding but this won't publish the changes.
    
    init(model: Model) {
        self.model = model
    }
}

Model:

struct Model {
    var name = ""
}

謝謝您的幫助!

好的, Model是結構,所以當您將它從ContentView Model 傳遞to ContentView2Model` 時,它只是被復制了

ContentView2(model: contentView1Model.model)

這種情況下,最好將 model 作為獨立的ObservableObject ,因此它將通過引用從一個視圖 model 傳遞到另一個視圖。

class Model: ObservableObject {
    @Published var name = ""
}

然后你可以注入它並在任何需要的子視圖中修改,比如

struct ContentView1: View {
    @StateObject var contentView1Model = ContentView1Model()
    var body: some View {
        NavigationView {
            VStack{
                ModelEditView(model: contentView1Model.model)       // << !!
                NavigationLink(destination: ContentView2(model: contentView1Model.model)){
                    Text("ToContentView2")
                }
            }
        }
    }
}

struct ContentView2: View {
    @StateObject var contentView2Model: ContentView2Model
    
    init(model: Model) {
        self._contentView2Model = StateObject(wrappedValue: ContentView2Model(model: model))
    }
    
    var body: some View {
        ModelEditView(model: contentView2Model.model)       // << !!
    }
}

struct ModelEditView: View {
    @ObservedObject var model: Model
    
    var body: some View {
        TextField("ModelName", text: $model.name)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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