如何检查AppDelegate当前是否已打开特定的ViewController

时间:2018-11-07 15:22:05

标签: ios swift viewcontroller appdelegate

我正在尝试阻止某个特定的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")
    }

2 个答案:

答案 0 :(得分:1)

通过启动messagesVC,您正在创建一个尚未展示的全新UserMessageViewController。您想要的控制器的特定实例已经被实例化,因此您必须使用视图控制器层次结构找到它。

AppDelegate使您可以访问应用程序的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,我们可以确定是否应显示通知。

答案 1 :(得分:0)

这应该对您有用:

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

您的appDelegate将引用VC。它可能应该是委托人的财产