swift - 对 SwiftUI 中的@EnvironmentObject 感到困惑

标签 swift swiftui

我正在尝试在 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/

相关文章:

ios - 应用程序将从位置唤醒后,didFinishLaunchingWithOptions 中的 LaunchOptions 为 nil

swift - 检查返回值是否为整数,如果是,则在 Swift 中返回字符串

ios - 如何更改表单内的 NavigationLink 箭头颜色

ios - 如何在我的 SwiftUI 应用程序中初始化我的 ViewModel

swift - 尝试在 SwiftUI 中使用时,实例方法 'appendInterpolation' 要求 'Decimal' 符合 '_FormatSpecifiable'

swift - 如何在 SwiftUI 中更改 PageTabViewStyle 的页面索引颜色?

ios - println(NSString(data : data, encoding : NSUTF8StringEncoding)) means in swift?)中的这些(响应、数据、错误)是什么

ios - NSLayout 约束隐藏 UIView

swift - 无法创建 MKCooperativeRegion 对象

ios - 如何转换数字类型?