当某个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")
}发布于 2018-11-07 15:37:34
通过启动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,我们可以确定是否应该显示通知。
发布于 2018-11-07 15:32:22
这应该适用于你:
if messagesVC.viewIfLoaded?.window != nil {
// viewController is visible, handle notification silently.
}您的appDelegate将有一个参考VC。它可能应该是委托的属性。
https://stackoverflow.com/questions/53192463
复制相似问题