[英]onChange not detecting AppDelegate Update in SwiftUI
我的 SwiftUI 應用程序中有一個 AppDelegate,我設置了一個 ViewModel,如下所示:
class AppDelegate: NSObject, UIApplicationDelegate, ObservableObject {
var AppNavigator: ApplicationNavigator = ApplicationNavigator()
}
這是我的 ApplicationNavigator 視圖模型:
class ApplicationNavigator: ObservableObject {
@Published var applicationNavigation: ApplicationNavigatorItem = ApplicationNavigatorItem(id: "default")
}
其中 ApplicationNavigator 采用ApplicationNavigatorItem
:
struct ApplicationNavigatorItem: Identifiable, Codable {
var id: String? = UUID().uuidString
}
當用戶點擊遠程通知時,我會使用新的ApplicationNavigatorItem
更新 AppDelegate 中的AppNavigator
:
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
self.AppNavigator.applicationNavigation = ApplicationNavigatorItem(
id: newUUID
)
}
現在到 SwiftUI 部分。
在我看來,我已將appDelegate
作為環境對象與我的視圖共享,因為我想監聽對appDelgate.AppNavigator.applicationNavigation.id
的更改。
我在主視圖中設置了一個onChanged
修飾符:
.onChange(of: appDelegate.AppNavigator.applicationNavigation.id) { _ in
DispatchQueue.main.async {
appDelegate.AppNavigator.navigate()
}
}
這僅在應用程序處於后台時用戶點擊推送通知時才有效。
但是,如果用戶在應用程序內收到推送通知,並且它處於活動狀態,則當他們點擊它時不會發生任何事情。
奇怪的是,在應用程序內點擊通知后,(沒有任何反應)如果我向上滑動應用程序直到它的 scenePhase 為.inactive
|| .background
,然后重新打開應用程序, .onChange(..) { _ in // code }
終於運行了。
我什至在主視圖上放了一個Text(appDelegate.AppNavigator.applicationNavigation.id!)
以查看appDelegate.AppNavigator.applicationNavigation.id
是否已更改,但如果我仍在應用程序內則不會。
如果他們點擊通知,我會嘗試將用戶發送到特定視圖,有時他們可能在應用程序內。 誰能幫我看看我在哪里犯了錯誤?
好的,我已經 1. 解決了問題,並且 2. 學到了一些關於 SwiftUI 的非常酷的東西!
我可以在我的視圖中創建一個 @ObservedObject ,而不是在appDelegate
中初始化ApplicationNavigator
:
@ObservedObject var appNavigator = ApplicationNavigator.shared
我可以將我的.onChange
修飾符更新為:
.onChange(of: appNavigator.applicationNavigation.id) { _ in
DispatchQueue.main.async {
// Do navigation things
}
}
然后當我想更新我的appDelegate
中的ApplicationNavigatorItem
時,我可以在ApplicationNavigator.shared
上設置它:
ApplicationNavigator.shared.applicationNavigation = ApplicationNavigatorItem(id: newUUID)
我感謝這篇幫助我的帖子!
PS如果您將.onAppear { }
附加到您的主視圖,無論您檢測到更改,並運行您在.onChange
中執行的代碼,即使應用程序根本沒有打開它也可以工作!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.