Как проверить, отображается ли UIViewController? - PullRequest
0 голосов
/ 02 апреля 2019

Я работаю над приложением, которое отображает расширение сегодня с некоторой информацией.Когда я нажимаю на расширение сегодня, оно открывает приложение и переходит к подпредставлению из корня для отображения информации.Обычно пользователь затем щелкает стрелку назад, чтобы вернуться к основному виду, но нет никакого способа узнать, действительно ли это сделано.Пользователь может вернуться к расширению сегодня и снова нажать.Когда это сделано, подпредставление снова открывается с новой информацией.Если это делается несколько раз, я получаю несколько экземпляров подпредставления, и мне приходится нажимать кнопку «Назад» на каждом из них, чтобы вернуться к основному виду.

Мой вопрос:Можно ли проверить, если подпредставление уже видно?Я хотел бы иметь возможность просто отправить ему обновленную информацию, вместо того, чтобы отображать совершенно новое представление.

В настоящее время я занимаюсь этим, сохраняя экземпляр UIViewController в верхней части моегокорень.Если это не ноль, то я просто передаю ему информацию и перерисовываю.Если это ноль, то я звоню performSegue и создаю новый.

Я просто думаю, что должен быть лучший способ справиться с этим.

Редактировать: Спасибо комментатору ниже, Я придумал этот код, который, кажется, делает то, что мне нужно.

        if let quoteView = self.navigationController?.topViewController as? ShowQuoteVC {
            quoteView.updateQuoteInformation(usingQuote: QuoteService.instance.getQuote(byQuoteNumber: quote))
        }
        else {
            performSegue(withIdentifier: "showQuote", sender: quote)
        }

Это отличается от предложенного поста, где ответ:

if (self.navigationController.topViewController == self) {
    //the view is currently displayed
}

В данном случае этоне работает, потому что когда я захожу в приложение из расширения Today, оно переходит к контроллеру корневого представленияМне нужно было проверить, отображается ли подпредставление, и self.navigationController.topViewcontroller == self никогда не будет работать, потому что я не проверяю, является ли контроллер вида сверху корневым контроллером вида.Предложения в этом посте больше подходят для того, что я пытаюсь выполнить.

1 Ответ

0 голосов
/ 02 апреля 2019

вы можете использовать это расширение, чтобы проверить, отображается ли в данный момент UIApplication UIViewController:

extension UIApplication {
    class func topViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController {
            return topViewController(base: nav.visibleViewController)
        }
        if let tab = base as? UITabBarController {
            if let selected = tab.selectedViewController {
                return topViewController(base: selected)
            }
        }
        if let presented = base?.presentedViewController {
            return topViewController(base: presented)
        }
        return base
    }
}

и пример использования:

 if let topController =  UIApplication.topViewController() {
        if !topController.isKind(of: MainViewController.self) { //MainViewController- the controller u wish to equal its type
            // do action...
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...