Present a view controller, dismiss it and present a different one in Swift Present a view controller, dismiss it and present a different one in Swift swift swift

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()    }  }}