我有课:
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 个小点
...
替换此处无用的任何代码。
您可以随时将
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)
...
}
}
}