Search code examples
swiftpopviewcontrollerdismissviewcontroller

How to dismiss viewcontroller and pop to root viewcontroller swift?


I have main TabbarController which holds ViewController(A). From this A pushed another ViewController(B) using navigationController?.pushViewController From B pushed another ViewController(C) using navigationController?.pushViewController From C modally presented another ViewController(D). From D when use taps button , it should dismiss D and popToRootViewController .

I googled similar questions, but couldn't find solution yet.

How can I do this?


Solution

  • Create a protocol

    protocol YourDelegate: class {
        func didDismiss()
    }
    

    In ViewController D, create a weak reference to the protocol

    weak var delegate: YourDelegate?
    

    In ViewController C, conform to the protocol and popToRootVC in the function

    extension ViewControllerC: YourDelegate {
        func didDismiss() {
            self.navigationController?.popToRootViewController()
        }
    }
    

    Also in ViewController C, set ViewControllerD's delegate to self where you present the VC

    //example:
    let vcD = ViewControllerD()
    vcD.delegate = self
    self.navigationController.pushViewController(vcD, animated: true)
    

    At last, in ViewController D, in your dismiss function closure, call the delegate function

    self.dismiss(animated: true) {
        self.delegate?.didDismiss()
    }