我正在尝试在 SwiftUI 中练习 @EnvironmentObject
工具。
ContentView
中的共享对象 User
初始化。
当我从 ContentView 切换到 NameView 时效果很好。
但是,从 NameView 到 AgeView 是失败的。 (请查看错误消息和代码 session )
错误信息
Fatal error: No ObservableObject of type User found.
有人可以给我建议吗?我想念什么吗?谢谢
代码
init "User" type in contentView
NavigationView
+-----------+ +--------+ +-------+
|ContentView+--NavigationLink-->|NameView+--NavigationLink-->|AgeView|
+-----------+ +--------+ +-------+
final class User: ObservableObject {
@Published var name: String
@Published var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
struct ContentView: View {
var user: User = User(name: "SomeName", age: 44)
var body: some View {
NavigationView {
VStack {
Text("name: \(self.user.name) age: \(self.user.age)")
NavigationLink(destination: NameView().environmentObject(self.user)) {
Text("Show Name")
}
}
}
}
}
struct NameView: View {
@EnvironmentObject var user: User
var body: some View {
VStack {
Text("name: \(self.user.name)")
NavigationLink(destination: AgeView()) {
Text("Show Age")
}
}
}
}
struct AgeView: View {
@EnvironmentObject var user: User
var body: some View {
VStack {
Text("age: \(self.user.age)")
}
}
}
最佳答案
希望这可以帮助您完成以下示例:
我们的模型是Observable 并且它的所有变量都Published:
class A: ObservableObject {
@Published var id: String = ""
@Published var value: String = ""
}
当将它用作EnvironmentObject 时,请确保在 SceneDelegate.swift 中将其设置如下:
let example = Example()
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: example.environmentObject(A()))
self.window = window
window.makeKeyAndVisible()
}
然后我们可以在所有 View 中使用这个EnvironmentObject:
struct Example: View {
@EnvironmentObject var obj: A
var body: some View {
Button(action: {
self.obj.value = "Hi im changed"
}) {
Text("Change me")
}
}
}
有时当你想更新这个对象中的数据时,xCode 可能会给你一个关于'No EnvironmentObject set for ... classname etc.'的错误,在这种情况下你需要传递一个 EnvironmentObject到目的地 View :
DestinationView().environmentObject(self.A)
希望这对您有所帮助,祝您好运!
关于swift - 对 SwiftUI 中的@EnvironmentObject 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58969342/