我正在尝试在@EnvironmentObject中使用SwiftUI工具。
共享对象User init在ContentView中。
当我从ContentView切换到NameView时,效果很好。
但是,从NameView到AgeView都失败了。(请查看错误消息和代码会话)
错误消息
Fatal error: No ObservableObject of type User found.有人能给我建议吗?我错过了什么吗?thx
码
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)")
}
}
}发布于 2019-11-22 15:31:10
希望这可以帮助您完成以下示例:
我们有我们的模型,它是可观测的,它的所有变量都是发布的
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()
}然后,我们可以在所有视图中使用这个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等‘的错误,在这种情况下,您需要将一个EnvironmentObject传递给目标视图:
DestinationView().environmentObject(self.A)希望这能帮上忙古德勒克!
发布于 2019-11-21 08:34:45
您正在将SceneDelegate中的SceneDelegate分配给ContentView,因此ContentView的所有子视图都可以自动访问用户。
因此,再次传递它是不必要的,如这里所示:NameView().environmentObject(self.user)
如果在environmentObject修饰符中显示视图,则只需要再次传递.sheet,因为它基本上是一个新的独立视图。
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 {
@EnvironmentObject var user: User
var body: some View {
NavigationView {
VStack {
Text("name: \(self.user.name) age: \(self.user.age)")
NavigationLink(destination: NameView()) {
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)")
}
}
}https://stackoverflow.com/questions/58969342
复制相似问题