我已经创建了在显示 C 控制器之前关闭 B 控制器的示例。你可以试试。
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 控制器上 -> 然后在 navController 中显示 C -> 然后从 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)
// 所有以前的控制器也将被解散,
// 但你不会看到它们,因为我将它们隐藏并添加到当前视图的窗口中。
但我认为解决方案可能无法涵盖您的所有情况。如果您的控制器未在整个屏幕上显示,则可能会出现问题,所有类似的事情,因为当我模拟该转换时,我不考虑事实,因此您可能需要根据您的特定情况调整扩展。