如果特定 ViewController 当前打开,如何检查 AppDelegate
How to check in AppDelegate if a particular ViewController is currently open
我试图阻止在某个 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")
}
这应该适合你:
if messagesVC.viewIfLoaded?.window != nil {
// viewController is visible, handle notification silently.
}
您的 appDelegate
将引用 VC。应该是delegate的属性
通过启动 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([=10=]) } ?? base
default:
return base?.presentedViewController.flatMap { topViewController([=10=]) } ?? 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
,我们可以确定是否应显示通知。
我试图阻止在某个 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")
}
这应该适合你:
if messagesVC.viewIfLoaded?.window != nil {
// viewController is visible, handle notification silently.
}
您的 appDelegate
将引用 VC。应该是delegate的属性
通过启动 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([=10=]) } ?? base
default:
return base?.presentedViewController.flatMap { topViewController([=10=]) } ?? 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
,我们可以确定是否应显示通知。