如何在 SwiftUI 中的两个视图模型之间共享已发布的模型?
How to share published model between two view models in SwiftUI?
我正在尝试访问两个不同视图模型中的同一个共享模型。两个关联的视图都需要访问视图模型中的模型并需要编辑模型。所以我不能只使用 EnvironmentObject 来访问模型。
我可以通过视图将模型传递给视图模型,但这不会使两个模型版本保持同步。有什么东西可以像绑定一样工作吗?因为通过绑定我可以访问模型,但是它不会在此视图中发布更改。
简化示例:
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
}
需要访问模型的相邻视图 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
}
}
型号:
struct Model {
var name = ""
}
感谢您的帮助!
好的,Model
是结构,所以当您通过 ContentView
Modelto
ContentView2Model` 通过
传递它时,它只是被复制
ContentView2(model: contentView1Model.model)
在这种情况下,最好将模型作为独立模型 ObservableObject
,因此它将通过引用从一个视图模型传递到另一个视图模型。
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)
}
}
我正在尝试访问两个不同视图模型中的同一个共享模型。两个关联的视图都需要访问视图模型中的模型并需要编辑模型。所以我不能只使用 EnvironmentObject 来访问模型。
我可以通过视图将模型传递给视图模型,但这不会使两个模型版本保持同步。有什么东西可以像绑定一样工作吗?因为通过绑定我可以访问模型,但是它不会在此视图中发布更改。
简化示例:
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
}
需要访问模型的相邻视图 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
}
}
型号:
struct Model {
var name = ""
}
感谢您的帮助!
好的,Model
是结构,所以当您通过 ContentView
Modelto
ContentView2Model` 通过
ContentView2(model: contentView1Model.model)
在这种情况下,最好将模型作为独立模型 ObservableObject
,因此它将通过引用从一个视图模型传递到另一个视图模型。
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)
}
}