ios - 如果当前打开了特定的 ViewController,如何检查 AppDelegate

标签 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")
    }

最佳答案

通过启动 messagesVC,您将创建一个全新的 UserMessageViewController,它还没有出现。您想要的 Controller 的特定实例已经实例化,因此您必须使用 View Controller 层次结构找到它。

AppDelegate 使您可以访问应用程序的 rootViewController,这将是 Storyboard中的第一个 Controller 。从这个 Controller ,您可以通过 subview Controller 搜索 UserMessageViewController

这是一个扩展,它将从 rootViewController 开始,向上冒泡,直到它到达 View Controller 层次结构堆栈的顶部。

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() 获取当前显示的 View Controller :

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

通过将顶 View Controller 转换为 UserMessageViewController,我们可以确定是否应显示通知。

关于ios - 如果当前打开了特定的 ViewController,如何检查 AppDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53192463/

相关文章:

ios - 为什么我有一个地址为“0x30000000”的对象?

ios - 为什么 SpriteKit 不显示任何内容?

ios - 初始化 Controller 的自类

Swift IBoutlet 默认值

ios - 点击时按钮图像上的动画

ios - 具有共享数据的应用程序的初始点

ios - GPPSignIn 因 NSInvalidArgumentException 而崩溃

带有用于吉他演奏的添加音频 channel 的 iOS 视频播放器

ios - UIActivityIndi​​catorView 隐藏属性默认设置为 YES

ios - Xcode( swift ) : I can't transfer data between View Controllers