Как проверить в AppDelegate, открыт ли определенный ViewController - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь запретить показ push-уведомлений на главном экране приложения, когда определенное userMessagesViewController открыто в данный момент. Я не хочу, чтобы пользователи получали push-уведомления, если этот конкретный viewController открыт. Моя функция, которая отправляет push-уведомление, находится в 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")
    }

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

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

0 голосов
/ 07 ноября 2018

Это должно работать для вас:

if messagesVC.viewIfLoaded?.window != nil {
    // viewController is visible, handle notification silently.
}

Ваш appDelegate будет иметь ссылку на ВК. Вероятно, это должно быть свойство делегата.

...