Попытка представить < OutgoingController: 0x1040e9600 > на < OutgoingController: 0x104042600 > чье представление не находится в иерархии окон

Помимо всех превосходных ответов выше, я обнаружил, что есть еще одна причина, чтобы удалить устаревшие вызовы API.

Изучать, почему вызов устарел. Я часто нахожу, что изучаю интересные вещи о Java / API / Рамочной основы. Часто существует веская причина, почему метод устаревает, и понимание этих причин приводит к более глубокому пониманию.

Итак, с точки зрения обучения / роста, это также стоит усилий

1
задан halfer 18 March 2019 в 19:34
поделиться

3 ответа

Я исправил это, пытаясь получить самый верхний контроллер вида через интервал 0,5 секунды.
т.е. я вызываю функцию displayOutgoingScreen через интервал 0,5 секунды.
В это время мой старый Исходящий контроллер полностью отключен, и я вижу свой исходящий экран.

0
ответ дан Jeeva 18 March 2019 в 19:34
поделиться

Я думаю, что вы пытаетесь представить экземпляр контроллера исходящих представлений до того, как другой экземпляр будет полностью удален.

Отправляя с задержкой, вы только замаскировали эту проблему.

Я хотел бы предложить вам, что, если у вас уже есть модально представленный контроллер представления является стеком, и вы отклоняете его, вы вызываете свою функцию представления внутри блока завершения функции dismiss. Таким образом, следующий контроллер представления будет представлен, когда предыдущий полностью удален из иерархии представления.

Но я все еще не думаю, что это хороший пользовательский опыт.

0
ответ дан Miki 18 March 2019 в 19:34
поделиться

Вы можете получить контроллер вида сверху, используя нижнее расширение:

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

Используйте это расширение, чтобы получить самый верхний контроллер вида в стеке навигации, используя следующий код:

guard let topVC = UIApplication.getTopMostViewController() else {return}

Предустановите свой вид контроллер, использующий контроллер вида сверху:

DispatchQueue.main.async(execute: { () -> Void in
    topVC.present(incomingcallController, animated: true, completion: nil)
}
0
ответ дан Hardik Halani 18 March 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: