首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI中@EnvironmentObject的混淆

SwiftUI中@EnvironmentObject的混淆
EN

Stack Overflow用户
提问于 2019-11-21 07:22:39
回答 2查看 3.2K关注 0票数 3

我正在尝试在@EnvironmentObject中使用SwiftUI工具。

共享对象User init在ContentView中。

当我从ContentView切换到NameView时,效果很好。

但是,从NameView到AgeView都失败了。(请查看错误消息和代码会话)

错误消息

代码语言:javascript
复制
Fatal error: No ObservableObject of type User found.

有人能给我建议吗?我错过了什么吗?thx

代码语言:javascript
复制
init "User" type in contentView
NavigationView

+-----------+                   +--------+                   +-------+
|ContentView+--NavigationLink-->|NameView+--NavigationLink-->|AgeView|
+-----------+                   +--------+                   +-------+
代码语言:javascript
复制
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)")
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2019-11-22 15:31:10

希望这可以帮助您完成以下示例:

我们有我们的模型,它是可观测的,它的所有变量都是发布的

代码语言:javascript
复制
class A: ObservableObject {
    @Published var id: String = ""
    @Published var value: String = ""
}

当将它作为EnvironmentObject使用时,请确保在SceneDelegate.swift中设置如下所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
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传递给目标视图:

代码语言:javascript
复制
DestinationView().environmentObject(self.A)

希望这能帮上忙古德勒克!

票数 4
EN

Stack Overflow用户

发布于 2019-11-21 08:34:45

您正在将SceneDelegate中的SceneDelegate分配给ContentView,因此ContentView的所有子视图都可以自动访问用户。

因此,再次传递它是不必要的,如这里所示:NameView().environmentObject(self.user)

如果在environmentObject修饰符中显示视图,则只需要再次传递.sheet,因为它基本上是一个新的独立视图。

代码语言:javascript
复制
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)")
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58969342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档