SwiftUI 错误未找到 GlobalEnvironment 类型的 ObservableObject
Posted
技术标签:
【中文标题】SwiftUI 错误未找到 GlobalEnvironment 类型的 ObservableObject【英文标题】:SwiftUI Error No ObservableObject of type GlobalEnvironment found 【发布时间】:2020-07-17 19:55:57 【问题描述】:我以为我已经正确设置了一切,但是我的应用程序崩溃了...在 SceneDelegate 中,我有以下代码:
// Create the SwiftUI view that provides the window contents.
let contentView = CalculatorView().environmentObject(GlobalEnvironment())
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
在我的 CalculatorView 结构中,我有:
@EnvironmentObject var env: GlobalEnvironment
var body: some View
HStack()
Spacer()
Text(env.outputToScreen)
我有一个名为“GlobalEnvironment”的类继承自 ObservableObject,其 @Published 属性设置如下:
class GlobalEnvironment: ObservableObject
@Published var textOutputToScreen: String = "Enter Name"
但是,当我的 CalculatorView 结构更改 textOutputToScreen 的值时,整个事情都崩溃了……我找到的所有帮助都说在 SceneDelegate 中设置 GlobalEnvironment,但我已经这样做了。我错过了什么?
【问题讨论】:
【参考方案1】:我在您的代码中没有看到按钮。因此,我根据您向我展示的内容制作了这个程序,并且它有效。
场景代理:
import UIKit
import SwiftUI
class SceneDelegate: UIResponder, UIWindowSceneDelegate
var window: UIWindow?
var env = GlobalEnvironment()
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
// Create the SwiftUI view that provides the window contents.
let contentView = CalculatorView().environmentObject(env)
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
然后是CalculatorView:
import SwiftUI
struct CalculatorView: View
@EnvironmentObject var env: GlobalEnvironment
var body: some View
HStack
Spacer()
Text(env.textOutputToScreen)
然后是 GlobalEnvironment:
import SwiftUI
class GlobalEnvironment: ObservableObject
@Published var textOutputToScreen = "Enter Name"
这给了我这个结果,这就是代码应该产生的结果。
【讨论】:
可以安全地假设let contentView = CalculatorView()environmentObject(env)
上的缺失句号是错字吗?
对不起,是的。我这边的错字。我无法测试你的代码,所以我不得不查看我的旧试验是如何完成的。通过调整名称,我不小心删除了句号。我改了。
我实际上问了错误的问题,这有效,但并不能完全解决我遇到的问题。很快就会提出另一个问题来帮助澄清(一旦我弄清楚如何问它)以上是关于SwiftUI 错误未找到 GlobalEnvironment 类型的 ObservableObject的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI 错误未找到 GlobalEnvironment 类型的 ObservableObject
SWIFTUI - 尝试从 OneDrive 和 GoogleDrive 等云文件提供商导入文件时出现文件未找到错误
SwiftUI-> 线程 1:致命错误:未找到 MyObject.Type 类型的可观察对象(工作表中的 EnvironmentObject)
SwiftUI @EnvironmentObject:未找到?
未找到 SwiftUI 符号:_$s7SwiftUI9TextFieldVAA4ViewAAMc Xcode 11 beta 3