gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:37:35 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com