首页 > 解决方案 > 检查特定视图控制器是否在 App 委托的前台打开

问题描述

我已经在我的应用程序中实现了推送通知。现在,当我的应用程序处于前台时,我想检查任一用户是否在聊天屏幕上,我尝试了各种代码,但它不起作用。我的聊天屏幕出现在这种情况下,首先我在最后一个标签下有标签栏控制器,当我点击它打开聊天屏幕时,标签栏控制器->最后一个标签 VC->聊天 VC。如果用户在前台并且通知到达,我想检查应用程序委托,无论用户是否在聊天屏幕上。我如何检查?这是我正在测试的代码,但它不起作用,

 if let chatViewController = storyboard.instantiateViewController(withIdentifier: "ChatDetailViewController") as? ChatDetailViewController, let tabBar = storyboard.instantiateViewController(withIdentifier: "TabBar") as? UITabBarController {

        let navigationController = UINavigationController(rootViewController: chatViewController)

        tabBar.hidesBottomBarWhenPushed = true
        tabBar.viewControllers = [navigationController]

       if tabBar.viewControllers == [navigationController]
       {
           completionHandler([])
        }
        else
       {
          completionHandler([.alert,.sound])
        }
    }

这是我的屏幕流程, 在此处输入图像描述

标签: iosnavigation

解决方案


您实际上是在创建ChatViewController. 相反,您需要获取当前打开的 ViewController 实例并检查它是否为ChatViewController.

这可能是一个解决方案。我想UITabBarController是您的应用程序的根视图控制器。

if let tabBar = window?.rootViewController as? UITabBarController {

        if let chatViewController = tabBar.selectedViewController as? ChatDetailViewController {
            completionHandler([])
            print("Chat VC is on top")
        }
        else {
            completionHandler([.alert,.sound])
            print("Chat VC is not on top")
        }

    }

如果标签栏控制器拥有一个导航控制器(可能应该),那么下面的代码应该可以工作。

if let tabBar = window?.rootViewController as? UITabBarController {

        if let navVC = tabBar.selectedViewController as? UINavigationController, let chatViewController = navVC.viewControllers.last as? ChatDetailViewController {
            completionHandler([])
            print("Chat VC is on top")
        }
        else {
            completionHandler([.alert,.sound])
            print("Chat VC is not on top")
        }

    }

推荐阅读