Present a view controller, dismiss it and present a different one in Swift
The error occurs because you are trying to present SecondController from FirstController after you have dismissed FirstController. This doesn't work:
self.dismiss(animated: true, completion: { let vc = SecondController() // 'self' refers to FirstController, but you have just dismissed // FirstController! It's no longer in the view hierarchy! self.present(vc, animated: true, completion: nil)})
This problem is very similar to a question I answered yesterday.
Modified for your scenario, I would suggest this:
weak var pvc = self.presentingViewControllerself.dismiss(animated: true, completion: { let vc = SecondController() pvc?.present(vc, animated: true, completion: nil)})
Only the presenting view controller (Root) can dismiss its presented view controller (First or Second).So you need to call dismiss(animated:completion:)
inside the Root view controller's class, not inside any other one:
class RootViewController: UIViewController { func buttonTapped() { let vc = FirstViewController() vc.delegate = self present(vc, animated: true) }}extension RootViewController: FirstViewControllerDelegate { func firstDidComplete() { dismiss(animated: true) { let vc = SecondViewController() vc.delegate = self present(vc, animated: true) } }}extension RootViewController: SecondViewControllerDelegate { func secondDidComplete() { dismiss(animated: true) { let vc = ThirdViewController() present(vc, animated: true) } }}// and so on
If FirstViewController presents other view controller and you want its dismissal animation, implement FirstViewController as follows:
extension FirstViewController: OtherViewControllerDelegate { func otherDidComplete() { dismiss(animated: true) { self.delegate?.firstDidComplete() } }}