¿Cómo eliminar ViewController en Swift?

Estoy intentando descartar un ViewController rápidamente llamando a dismissViewController en una 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") } 

imagen aleatoria de una segue

Pude ver el post de printing en la salida de la console, pero ViewController nunca se descarta. ¿Cual podría ser el problema?

Desde tu image parece que presentaste el ViewController usando push

Necesitas usar

 navigationController.popViewControllerAnimated(true) 

El dismissViewControllerAnimated se usa para cerrar ViewControllers que se presentaron usando modal

Actualización Swift 3.0:

 navigationController?.popViewController(animated: true) dismiss(animated: true, completion: nil) 

Tengo una solución para tu problema. Pruebe este código para descartar el controller de vista si presenta la vista utilizando modal:

Swift 3:

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

O

Si presenta la vista utilizando "push" segue

 self.navigationController?.popViewController(animated: true) 

si haces esto, supongo que es posible que no recibas un post de printing en la 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") } } 
  1. Incruste la vista que desea descartar en un control de navigation
  2. agregar un button de barra con "Listo" como identificador
  3. Invoca al Editor auxiliar con el button Listo seleccionado.
  4. crea una IBAction para este button
  5. agregue esta línea entre paréntesis:

     self.dismissViewControllerAnimated(true, completion: nil) 

Utilizar:

 self.dismissViewControllerAnimated(true, completion: nil) 

en lugar de:

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

Si presenta un controller sin un controller de navigation, puede llamar al siguiente código de un método del controller presentado.

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

Si su ViewController se presenta de manera modal, la opción presentingViewController no será nula y el código se ejecutará.

En Swift 3.0 es tan fácil como escribir esto en tu function:

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

O si está en un controller de navigation, puede "abrirlo":

 self.navigationController?.popViewController(animated: true) 

Esta es la única manera de descartar el controller de vista actual y volver al controller de vista anterior. Puede hacer esto solo a través de Storyboard.

  1. Abrir Storyboard
  2. Haga clic derecho en el button Cancelar y arrástrelo al controller de vista anterior, donde desea volver al controller anterior
  3. Ahora suelte el button derecho y podrá ver algunas acciones que se realizan en el button cancelar
  4. Ahora elija la opción "popover present" de la list
  5. Ahora puede descartar su vista actual haciendo clic en el button cancelar

Intenta esto, está trabajando conmigo.

Segunda vía: uso: navigationController.popViewControllerAnimated(true)

La mejor de las suertes..

No cree ningún segue de Cancelar o Hecho a otro VC y solo escriba este código sus botones @IBAction

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

Basado en mi experiencia, agrego un método para descartarme como extensión de UIViewController:

 extension UIViewController { private func dismissMe(animated: Bool, completion: (()->())?) { var count = 0 if let c = self.navigationController?.childViewControllers.count { count = c } if count > 1 { //Pop the last view controller off navigation controller list self.navigationController!.popViewController(animated: animated) if let handler = completion { handler() } } else { //Dismiss the last vc or vc without navigation controller dismiss(animated: animated, completion: completion) } } } 

Luego UIViewController este método para descartar el controller de vista en cualquier subclass UIViewController . Por ejemplo, en la acción de cancelar:

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

Como reference, tenga en count que podría estar rechazando el controller de vista incorrecto. Por ejemplo, si tiene un cuadro de alerta o modal que se muestra encima de otro modal. (Podría tener una alerta de publicación de Twitter que se muestre encima de su alerta modal actual, por ejemplo). En este caso, debe llamar a la function de descarte dos veces o utilizar una function de desenrollar.

Si está presentando un ViewController de manera modal y quiere volver al ViewController raíz, asegúrese de descartar este ViewController presentado de manera modal antes de volver al ViewController raíz, de lo contrario, este ViewController no se eliminará de la Memoria y ocasionará pérdidas de memory.

En Swift 3.0

Si desea descartar un controller de vista presentado

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

Este código escrito en acción de button para rechazar

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