如果您想在多个视图之间传递模型,可以多次使用@StateObject(请参见下面的示例)以便每个视图都可以修改该对象吗?我很欣赏使用 @EnvironmentObject 可以更好地完成此操作,但只是想了解这个新的属性包装器在这种情况下如何工作。
// MARK: - MODEL
class Model: ObservableObject {
@Published var temperature = 27.5
}
Run Code Online (Sandbox Code Playgroud)
。
// MARK: - APP.SWIFT
@main
struct SwiftUI_DataFlow_005App: App {
@ObservedObject var model = Model()
var body: some Scene {
WindowGroup {
ContentView(model: model)
}
}
}
Run Code Online (Sandbox Code Playgroud)
。
// MARK: - CONTENT VIEW
struct ContentView: View {
@StateObject var model: Model
var body: some View {
VStack {
Text("\(model.temperature)")
AnotherView(model: model)
}
}
}
// MARK: - ANOTHER VIEW
struct AnotherView: View {
@StateObject var model: Model
var body: some View {
Text("\(model.temperature)")
}
}
Run Code Online (Sandbox Code Playgroud)
@StateObject
是事实来源,所以它必须在一个地方创建,所以(示意性地如您提供的屏幕截图,但不是要修改的代码)
in App >
@StateObject private var model = Model()
...
ContentView().environmentObject(model)
...
in ContentView >
@EnvironmentObject var model: Model
...
in AnotherView >
@EnvironmentObject var model: Model
Run Code Online (Sandbox Code Playgroud)
基于已接受答案的小扩展,以便未来的读者可以获得更多的见解。
1 - @ObservedObject
从Apple文档看来,一种解决方案是在所有三个视图上使用@ObservedObject。
// MARK: - CONTENT VIEW
struct ContentView: View {
@ObservedObject var model: Model
var body: some View {
VStack {
Text("\(model.temperature)")
AnotherView(model: model)
}
}
}
Run Code Online (Sandbox Code Playgroud)
。
// MARK: - ANOTHER VIEW
struct AnotherView: View {
@ObservedObject var model: Model
var body: some View {
Text("\(model.temperature)")
}
}
Run Code Online (Sandbox Code Playgroud)
2 - @EnvironmentObject
另一个解决方案@asperi,也是迄今为止最简单的解决方案,是在 app.swift 中将模型创建为 @StateObject,然后将对象注入到环境中。这意味着您不必通过层次结构传递模型,而是使用 @EnviromentObject 根据需要访问它。
// MARK: - APP.SWIFT
@main
struct SwiftUI_DataFlow_005App: App {
@StateObject var model = Model()
var body: some Scene {
WindowGroup {
ContentView().environmentObject(model)
}
}
}
Run Code Online (Sandbox Code Playgroud)
。
// MARK: - CONTENT VIEW
struct ContentView: View {
@EnvironmentObject var model: Model
var body: some View {
VStack {
Text("\(model.temperature)")
AnotherView()
}
}
}
Run Code Online (Sandbox Code Playgroud)
。
// MARK: - ANOTHER VIEW
struct AnotherView: View {
@EnvironmentObject var model: Model
var body: some View {
Text("\(model.temperature)")
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6348 次 |
最近记录: |