首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在当前打开特定的AppDelegate时签入ViewController

如何在当前打开特定的AppDelegate时签入ViewController
EN

Stack Overflow用户
提问于 2018-11-07 15:22:04
回答 2查看 1.1K关注 0票数 1

当某个userMessagesViewController当前处于打开状态时,我试图阻止应用程序主屏幕上的推送通知显示。如果这个特定的viewController是打开的,我不希望用户收到推送通知。发送推送通知的函数位于appDelegate中。我怎样才能检查。到目前为止,我的执行情况如下。

代码语言:javascript
复制
  let messagesVC = UserMessageViewController()

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-07 15:37:34

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

AppDelegate允许您访问应用程序的rootViewController,这将是您在故事板中拥有的第一个控制器。从这个控制器中,您可以通过子视图控制器搜索UserMessageViewController

下面是一个扩展,它将从rootViewController开始,一直到视图控制器层次结构堆栈的顶部。

代码语言:javascript
复制
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()显示的当前视图控制器。

代码语言:javascript
复制
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,我们可以确定是否应该显示通知。

票数 2
EN

Stack Overflow用户

发布于 2018-11-07 15:32:22

这应该适用于你:

代码语言:javascript
复制
if messagesVC.viewIfLoaded?.window != nil {
    // viewController is visible, handle notification silently.
}

您的appDelegate将有一个参考VC。它可能应该是委托的属性

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53192463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档