簡體   English   中英

onChange 未在 SwiftUI 中檢測到 AppDelegate 更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM