Инициируя 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
, мы можем определить, должно ли быть представлено уведомление.