How to dismiss ViewController in Swift?

IosSwiftXcodeStoryboardViewcontroller

Ios Problem Overview


I am trying to dismiss a ViewController in swift by calling dismissViewController in an IBAction

  @IBAction func cancel(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
}

@IBAction func done(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
}

random image of a segue

I could see the println message in console output but ViewController never gets dismissed. What could be the problem?

Ios Solutions


Solution 1 - Ios

From you image it seems like you presented the ViewController using push

The dismissViewControllerAnimated is used to close ViewControllers that presented using modal

Swift 2

navigationController.popViewControllerAnimated(true)

Swift 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)

Solution 2 - Ios

I have a solution for your problem. Please try this code to dismiss the view controller if you present the view using modal:

Swift 3:

self.dismiss(animated: true, completion: nil)

OR

If you present the view using "push" segue

self.navigationController?.popViewController(animated: true)

Solution 3 - Ios

if you do this i guess you might not get println message in console,

@IBAction func cancel(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
   }
}

@IBAction func done(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
  }    
}

Solution 4 - Ios

In Swift 3.0 to 4.0 it's as easy as typing this into your function:

self.dismiss(animated: true, completion: nil)

Or if you're in a navigation controller you can "pop" it:

self.navigationController?.popViewController(animated: true)

Solution 5 - Ios

  1. embed the View you want to dismiss in a NavigationController

  2. add a BarButton with "Done" as Identifier

  3. invoke the Assistant Editor with the Done button selected

  4. create an IBAction for this button

  5. add this line into the brackets:

     self.dismissViewControllerAnimated(true, completion: nil)
    

Solution 6 - Ios

Use:

self.dismiss(animated: true, completion: nil)

instead of:

self.navigationController.dismissViewControllerAnimated(true, completion: nil)

Solution 7 - Ios

From Apple documentations:

> The presenting view controller is responsible for dismissing the view controller it presented

Thus, it is a bad practise to just invoke the dismiss method from it self.

What you should do if you're presenting it modal is:

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

Solution 8 - Ios

If you presenting a controller without a Navigation Controller, you can call the following code from a method of the presented controller.

self.presentingViewController?.dismiss(animated: true, completion: nil)

If your ViewController is presented modally, optional presentingViewController will be not nil and the code will be executed.

Solution 9 - Ios

Based on my experience, I add a method to dismiss me as extension to UIViewController:

extension UIViewController {
    func dismissMe(animated: Bool, completion: (()->())?) {
        var count = 0
        if let c = self.navigationController?.viewControllers.count {
            count = c
        }
        if count > 1 {
            self.navigationController?.popViewController(animated: animated)
            if let handler = completion {
                handler()
            }
        } else {
            dismiss(animated: animated, completion: completion)
        }
    }
}

Then I call this method to dismiss view controller in any UIViewController subclass. For example, in cancel action:

class MyViewController: UIViewController {
   ...
   @IBAction func cancel(sender: AnyObject) {
     dismissMe(animated: true, completion: nil)
   }
   ...
}

Solution 10 - Ios

Don't create any segue from Cancel or Done to other VC and only write this code your buttons @IBAction

@IBAction func cancel(sender: AnyObject) {
    dismiss(animated: false, completion: nil)
}

Solution 11 - Ios

Here is the one way to dismiss present view controller and move back to previous view controller. You can do this through Storyboard only.

  1. Open Storyboard
  2. Right click on Cancel button and drag it to previous view controller, where you want to move back to previous controller
  3. Now release the right click and you can see some actions which performs on cancel button
  4. Now choose "popover present" option from list
  5. Now you can dismiss your current view by click on cancel button

Please try this, It's working with me.

Second Way - Use - navigationController.popViewControllerAnimated(true)

Best luck..

Solution 12 - Ios

Since you used push presented viewController, therefore, you can use

self.dismiss(animated: false, completion: nil)

Solution 13 - Ios

For reference, be aware that you might be dismissing the wrong view controller. For example, if you have an alert box or modal showing on top of another modal. (You could have a Twitter post alert showing on top of your current modal alert, for example). In this case, you need to call dismiss twice, or use an unwind segue.

Solution 14 - Ios

So if you wanna dismiss your Viewcontroller use this. This code is written in button action to dismiss VC

  @IBAction func cancel(sender: AnyObject) {
   dismiss(animated: true, completion: nil)
  }

Solution 15 - Ios

Try this:

@IBAction func close() {
  dismiss(animated: true, completion: nil)
}

Solution 16 - Ios

If you using the present method in the parent VC then you should call this function, to dismiss the child VC use this

self.dismiss(animated: true, completion: nil)

if you calling child VC by using push method, to dismiss the child VC use this

self.navigationController?.popViewController(animated: true)

Solution 17 - Ios

If you are presenting a ViewController modally, and want to go back to the root ViewController, take care to dismiss this modally presented ViewController before you go back to the root ViewController otherwise this ViewController will not be removed from Memory and cause Memory leaks.

Solution 18 - Ios

In Swift 3.0

If you want to dismiss a presented view controller

self.dismiss(animated: true, completion: nil)

Solution 19 - Ios

In Swift 4.1 and Xcode 9.4.1

If you use pushViewController to present new view controller, use this

self.navigationController?.popViewController(animated: false)

Solution 20 - Ios

@IBAction func back(_ sender: Any) {
        self.dismiss(animated: false, completion: nil)
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionrshankarView Question on Stackoverflow
Solution 1 - IosZoon NoozView Answer on Stackoverflow
Solution 2 - IossatheeshView Answer on Stackoverflow
Solution 3 - IosBaShaView Answer on Stackoverflow
Solution 4 - IosChase McElroyView Answer on Stackoverflow
Solution 5 - IosLAOMUSIC ARTSView Answer on Stackoverflow
Solution 6 - IosjobimaView Answer on Stackoverflow
Solution 7 - IosOhadMView Answer on Stackoverflow
Solution 8 - IosPeyotleView Answer on Stackoverflow
Solution 9 - IosDavid.Chu.caView Answer on Stackoverflow
Solution 10 - IosFatihView Answer on Stackoverflow
Solution 11 - IosChetan BhalaraView Answer on Stackoverflow
Solution 12 - IosIonicView Answer on Stackoverflow
Solution 13 - IosmcfroobView Answer on Stackoverflow
Solution 14 - IosSai kumar ReddyView Answer on Stackoverflow
Solution 15 - Iosuser6378925View Answer on Stackoverflow
Solution 16 - IosFarrukh MakhmudovView Answer on Stackoverflow
Solution 17 - IosdanView Answer on Stackoverflow
Solution 18 - IosRamakrishnaView Answer on Stackoverflow
Solution 19 - IosNareshView Answer on Stackoverflow
Solution 20 - Ioseng mohamed emamView Answer on Stackoverflow