Помимо всех превосходных ответов выше, я обнаружил, что есть еще одна причина, чтобы удалить устаревшие вызовы API.
Изучать, почему вызов устарел. Я часто нахожу, что изучаю интересные вещи о Java / API / Рамочной основы. Часто существует веская причина, почему метод устаревает, и понимание этих причин приводит к более глубокому пониманию.
Итак, с точки зрения обучения / роста, это также стоит усилий
Я исправил это, пытаясь получить самый верхний контроллер вида через интервал 0,5 секунды.
т.е. я вызываю функцию displayOutgoingScreen через интервал 0,5 секунды.
В это время мой старый Исходящий контроллер полностью отключен, и я вижу свой исходящий экран.
Я думаю, что вы пытаетесь представить экземпляр контроллера исходящих представлений до того, как другой экземпляр будет полностью удален.
Отправляя с задержкой, вы только замаскировали эту проблему.
Я хотел бы предложить вам, что, если у вас уже есть модально представленный контроллер представления является стеком, и вы отклоняете его, вы вызываете свою функцию представления внутри блока завершения функции dismiss. Таким образом, следующий контроллер представления будет представлен, когда предыдущий полностью удален из иерархии представления.
Но я все еще не думаю, что это хороший пользовательский опыт.
Вы можете получить контроллер вида сверху, используя нижнее расширение:
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)
}