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