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:WebView 不加载特定页面

未找到 SwiftUI 符号:_$s7SwiftUI9TextFieldVAA4ViewAAMc Xcode 11 beta 3