如何在 SwiftUi (iOS 15 / Xcode 13.2.1) 的 AppDelegate 中使用我的 @EnvironmentObject?

问题描述 投票:0回答:1

我有课:

class AppInfos_M: ObservableObject {
    @Published var currentUser: User_M = User_M()
    @Published var userTo: User_M = User_M()
}

我在

main
中声明它并通过
environmentObject
传递到我的视图:

...

@main
struct TestApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
...

    @StateObject var appInfos_M = AppInfos_M()
    
    var body: some Scene {
        WindowGroup {
            LaunchScreen_V()
                .environmentObject(appInfos_M)
...
 
        }
    }
}

该课程在我的应用程序中运行得非常好。现在我需要从

AppDelegate
修改它,因为当我收到通知时我需要得到
appInfos_M.userTo.id
。我尝试了几种方法,但没有任何效果。我怎样才能访问它?

在我需要它的所有视图中,我声明这种方式并且它工作正常,但不是在

AppDelegate
,为什么?:

 @EnvironmentObject var appInfos_M: AppInfos_M

这是我尝试过但不起作用的测试之一:

...

class AppDelegate: NSObject, UIApplicationDelegate { ... }

...

@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {

...

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {

@EnvironmentObject var appInfos_M: AppInfos_M

 let userInfo = response.notification.request.content.userInfo

appInfos_M.userTo.id = "just for testing here" // <- i get this error : Thread 1: Fatal error: No ObservableObject of type AppInfos_M found. A View.environmentObject(_:) for AppInfos_M may be missing as an ancestor of this view.

...

请注意,3 个小点

...
替换此处无用的任何代码。

ios swiftui appdelegate environmentobject
1个回答
5
投票

您可以随时将

AppInfos_M
存储在您的
AppDelegate
中,就像这样

class AppDelegate: NSObject, UIApplicationDelegate {
    var appInfos = AppInfos_M()
    (...)
}

然后您可以将其用作环境对象,如下所示:

...
@main
struct TestApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
...
    
    var body: some Scene {
        WindowGroup {
            LaunchScreen_V()
                .environmentObject(appDelegate.appInfos)
...
 
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.