swift - 如何在 SwiftUI 的应用程序文件中使用 EnvironmentObject

标签 swift xcode swiftui environmentobject

是否可以在新的 SwiftUI 2.0 项目的应用程序文件中使用 EnvironmentObject?
我正在使用以下代码,但出现错误:

Fatal error: No ObservableObject of type Authentication found. A View.environmentObject(_:) for Authentication may be missing as an ancestor of this view.: file SwiftUI, line 0

我假设这个错误是因为我还没有在任何 View 中使用 .environmentObject 修饰符,所以 UserAuth 还没有被放置在环境中。

但我希望此 loginStatus 在我的应用程序中的任何位置都可用,并且能够在我的应用程序中的任何位置在 UserAuth 类的一个常见实例上使用函数 getLoginStatus。

我希望将它放在我的 rootView 中并让它应用于所有 View ,但不确定如何使用我的应用程序文件中的以下结构来做到这一点。

enum LoginStatus {
    case signedIn
    case signedOut
}

import SwiftUI

@main
struct ExampleApp: App {

    @EnvironmentObject var userAuth: UserAuth

    init() {
        userAuth.getLoginStatus()
    }
    
    var body: some Scene {
        WindowGroup {
            switch userAuth.loginStatus {
            case .signedIn:
                Text("Signed In")
            case .signedOut:
                Text("Signed Out")
            }
        }
    }
}

import SwiftUI

class UserAuth: ObservableObject {
    
    @Published var loginStatus: LoginStatus = .undetermined
    
    func getLoginStatus() {
        // asynchrounously set loginStatus
    }
}

最佳答案

您可以将它用作该级别的常规属性,并在需要时作为环境向下传递到 View 层次结构中,例如

struct ExampleApp: App {

    let userAuth = UserAuth()     // << here !!
    
    var body: some Scene {
        WindowGroup {
            switch userAuth.loginStatus {
            case .signedIn:
                ContentView()
                   .environmentObject(userAuth)    // << here !!
            case .signedOut:
                Text("Signed Out")
            }
        }
    }
}

关于swift - 如何在 SwiftUI 的应用程序文件中使用 EnvironmentObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66794659/

相关文章:

swift - 为什么使用 EXC_BAD_INSTRUCTION 将 minWidth 设置为 .infinity 会使 SwiftUI 应用程序崩溃?

ios - SwiftUI NavigationLink 选定的值重置为零

在 firebase 中保存时 iOS 快速异常

ios - 如何使用GraphicContext快速获得书法线条笔刷效果

ios - 更改 UIPickerView 的标签

objective-c - 如何加快 Mac 应用程序处理 5000 个独立任务的速度?

iphone - Xcode,只检索带有字母 A 的地址簿姓氏(依此类推)

ios - Text 或 Image 等 View 类型如何符合 SwiftUI 中的 View 协议(protocol)?

swift - SpriteKit 的界面生成器

xcode - 未使用MonoTouch创建的 View Controller 的头文件