¿Cómo descartar ViewController en Swift?

Estoy tratando de descartar un ViewController rápidamente llamando a dismissViewController en un 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 un segue

Pude ver el mensaje de impresión en la salida de la consola, pero ViewController nunca se descarta. ¿Cual podría ser el problema?

Desde su imagen, parece que presentó ViewController usando push

Tienes que usar

 navigationController.popViewControllerAnimated(true) 

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

Actualización de Swift 3.0:

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

Tengo una solución para tu problema. Pruebe este código para cerrar el controlador de vista si presenta la vista con modal:

Swift 3:

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

O

Si presenta la vista usando segue “push”

 self.navigationController?.popViewController(animated: true) 

si haces esto, supongo que es posible que no obtengas un mensaje de impresión en la consola,

 @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. incrustar la Vista que desea descartar en un NavigationController
  2. agregue un BarButton con “Hecho” como identificador
  3. invocar el Editor Asistente con el botón Hecho seleccionado
  4. crea un IBAction para este botón
  5. agregue esta línea entre los paréntesis:

     self.dismissViewControllerAnimated(true, completion: nil) 

Utilizar:

 self.dismissViewControllerAnimated(true, completion: nil) 

en lugar de:

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

En Swift 3.0 a 4.0 es tan fácil como escribir esto en tu función:

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

O si estás en un controlador de navegación, puedes “mostrarlo”:

 self.navigationController?.popViewController(animated: true) 

Si presenta un controlador sin un Controlador de navegación, puede llamar al siguiente código desde un método del controlador presentado.

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

Si su ViewController se presenta de manera modal, la presentación de control de vista opcional no será nula y el código se ejecutará.

En función de mi experiencia, agregué un método para descartarme como extensión de 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) } } } 

Luego llamo a este método para descartar el controlador de vista en cualquier subclase UIViewController . Por ejemplo, en cancelar acción:

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

No cree ningún intervalo de Cancelar o Listo a otro CV y solo escriba este código en sus botones @IBAcción

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

Esta es la única manera de descartar el controlador de vista actual y regresar al controlador de vista anterior. Puedes hacerlo a través de Storyboard solamente.

  1. Abrir Storyboard
  2. Haga clic con el botón derecho en el botón Cancelar y arrástrelo al controlador de vista anterior, donde desea regresar al controlador anterior
  3. Ahora suelte el clic derecho y podrá ver algunas acciones que se ejecutan en el botón cancelar.
  4. Ahora elija la opción “presente popover” de la lista
  5. Ahora puede descartar su vista actual haciendo clic en el botón cancelar

Por favor, intente esto, está trabajando conmigo.

Second Way – Use – navigationController.popViewControllerAnimated(true)

La mejor de las suertes..

Como referencia, tenga en cuenta que puede estar descartando el controlador de vista incorrecto. Por ejemplo, si tiene un cuadro de alerta o modal que se muestra sobre otro modal. (Podría tener una alerta de publicación de Twitter que se muestra encima de su alerta modal actual, por ejemplo). En este caso, debe llamar a despedir dos veces o utilizar un segue de desenrollado.

Si presenta un ViewController de manera modal y desea regresar al ViewController raíz, tenga cuidado de descartar este ViewController presentado de manera modal antes de volver al control raíz ViewController; de lo contrario, este ViewController no se eliminará de la memoria y provocará pérdidas de memoria.

Este código escrito en la acción del botón para descartar

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

En Swift 3.0

Si desea descartar un controlador de vista presentado

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

En Swift 4.1 y Xcode 9.4.1

Si usa pushViewController para presentar el nuevo controlador de vista, use esto

 self.navigationController?.popViewController(animated: false) 
Intereting Posts