簡體   English   中英

如何檢查AppDelegate當前是否已打開特定的ViewController

[英]How to check in AppDelegate if a particular ViewController is currently open

我試圖阻止當前打開某些userMessagesViewController時在應用程序主屏幕上顯示推送通知。 如果此特定的viewController打開,我不希望用戶收到推送通知。 我發送推送通知的函數在appDelegate 我該如何檢查。 到目前為止,這是我的實現。

  let messagesVC = UserMessageViewController()

    if messagesVC.view.window != nil {
        print("Messages viewcontroller is visible and open")
        } else {
        print("Messages viewcontroller isnt visible and not open")
    }

通過啟動messagesVC ,您將創建一個尚未呈現的全新UserMessageViewController 您想要的控制器的特定實例已經被實例化,因此您必須使用視圖控制器層次結構找到它。

AppDelegate使您可以訪問應用程序的rootViewController ,這將是rootViewController中的第一個控制器。 通過此控制器,您可以遍歷子視圖控制器以查找UserMessageViewController

這是一個擴展,它將從rootViewController開始,然后向上擴展直到到達視圖控制器層次結構堆棧的頂部。

extension UIApplication {
    func topViewController(_ base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        switch (base) {
        case let controller as UINavigationController:
            return topViewController(controller.visibleViewController)
        case let controller as UITabBarController:
            return controller.selectedViewController.flatMap { topViewController($0) } ?? base
        default:
            return base?.presentedViewController.flatMap { topViewController($0) } ?? base
        }
    }
}

創建一個名為UIApplication+TopViewController.swift的新文件,並將其粘貼到上述擴展名中。 然后在AppDelegate內部,您將能夠使用UIApplication.shared.topViewController()獲得當前呈現的視圖控制器:

if let messagesVC = UIApplication.shared.topViewController() as? UserMessageViewController {
    print("Messages viewcontroller is visible and open")
} else {
    print("Messages viewcontroller isnt visible and not open")
}

通過將頂部視圖控制器轉換為UserMessageViewController ,我們可以確定是否應顯示通知。

這應該為您工作:

if messagesVC.viewIfLoaded?.window != nil {
    // viewController is visible, handle notification silently.
}

您的appDelegate將引用VC。 它可能應該是委托人的財產

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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