Я создал пример для снятия контроллера B перед показом контроллера C.Вы можете попробовать.
let bController = ViewController()
let cController = ViewController()
aController.present(bController, animated: true) {
DispatchQueue.main.asyncAfter(wallDeadline: .now()+2, execute: {
let presentingVC = bController.presentingViewController
bController.dismiss(animated: false, completion: {
presentingVC?.present(cController, animated: true, completion: nil)
})
})
}
Но, на мой взгляд, решение с использованием контроллера навигации будет лучшим для данного случая.Например, вы можете поместить только контроллер B в контроллер навигации -> представить navController на контроллере A -> затем показать C внутри navController -> затем удалить из контроллера C весь navController -> И вы снова увидите контроллер A.Подумайте и о решении.
Другое решение
Я проверил другое решение.Вот расширение, которое должно решить вашу проблему.
extension UIViewController {
func dissmissViewController(toViewController: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {
self.dismiss(animated: flag, completion: completion)
self.view.window?.insertSubview(toViewController.view, at: 0)
dissmissAllPresentedControllers(from: toViewController)
if toViewController.presentedViewController != self {
toViewController.presentedViewController?.dismiss(animated: false, completion: nil)
}
}
private func dissmissAllPresentedControllers(from rootController: UIViewController) {
if let controller = rootController.presentedViewController, controller != self {
controller.view.isHidden = true
dissmissAllPresentedControllers(from: controller)
}
}
}
Использование
let rootController = self.presentingViewController!.presentingViewController! //Pointer to controller which should be shown after you dismiss current controller
self.dissmissViewController(toViewController: rootController, animated: true)
// Все предыдущие контроллеры тоже будут отклонены, // но вы их не увидите, потому что я их скрываю идобавить в окно текущего вида.
Но решение, я думаю, может не охватить все ваши случаи.И потенциально может возникнуть проблема, если ваши контроллеры не будут отображаться на весь экран, что-то в этом роде, потому что, когда я имитирую этот переход, я не учитываю этот факт, поэтому вам нужно подогнать расширение, возможно, к вашему конкретному случаю.