Tyler
Tyler

Reputation: 2386

How to dismiss current view controller and parentviewcontroller?

I am presenting two view controller like so

self.presentViewController(choosePlace, animated: true, completion: nil)
self.presentViewController(shareController, animated: true, completion: nil)

and I want to dismiss both of them like this:

println("parent \(self.parentViewController)")
            self.dismissViewControllerAnimated(true, completion: {

            self.parentViewController?.dismissViewControllerAnimated(true, completion: nil)
            })

self.parentViewController is always nil though. How can I dismiss two at the same time?

Upvotes: 7

Views: 21439

Answers (4)

shinoy
shinoy

Reputation: 146

Swift 4

There where some issue I faced while trying Michael Voline's answer.

As the comment on the answer it did not work for me. it was because of the presentingViewController was nil. So we need to set in a different property say presentingController but this will not work if you are setting it on the viewDidLoad

private var presentingController: UIViewController?
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    presentingController = presentingViewController
}

then

    dismiss(animated: false, completion: {
         self.presentingController?.dismiss(animated: false)
    })

I made the animation false so that the user will not see the UIof presenting view controller in the split seconds of dismissing.

Upvotes: 6

user11272571
user11272571

Reputation: 31

You can reference the presenting view controller during the function 'viewWillDisappear' of your view controller (i.e ShareController dismisses choosePlace just before it leaves scope).

//place the below in shareController 
override func viewWillDisappear(_ animated: Bool) {
    self.presentingViewController?.dismiss(animated: false, completion: nil)
}

Upvotes: 3

kimyunseo
kimyunseo

Reputation: 19

If Michael Voline's solution doesn't work , try the following code.

let customViewController = self.presentingViewController as? CustomViewController

self.dismiss(animated: true) {

   customViewController?.dismiss(animated: true, completion: nil)

}

Upvotes: 1

Michael Voline
Michael Voline

Reputation: 383

You can:

self.dismissViewControllerAnimated(true, completion: { 
    self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
})

So, make sure that you are presenting your view controllers in order:

parentViewController -> choosePlace -> shareController

(arrows indicate "self.presentViewController")

Upvotes: 7

Related Questions