Swift: prepare ForSegue con el controller de navigation

Estoy desarrollando una aplicación de iOS en Swift.

Quiero enviar datos de una vista a otra utilizando la function prepareForSegue.

Sin embargo, mi vista de destino está precedida por un controller de navigation, por lo que no funciona.

¿Cómo puedo hacer esto por favor?

En prepareForSegue acceda al controller de navigation de destino y luego a su parte superior:

 let destinationNavigationController = segue.destinationViewController as UINavigationController let targetController = destinationNavigationController.topViewController 

Swift 3.0

 let destinationNavigationController = segue.destination as! UINavigationController let targetController = destinationNavigationController.topViewController 

Desde el controller de destino puede acceder a su vista y pasar datos.

Supongamos que desea enviar datos desde SendViewController al ReceiveViewController:

  1. Agregue esto a SendViewController

     override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "segueShowNavigation"{ var DestViewController = segue.destinationViewController as! UINavigationController let targetController = DestViewController.topViewController as! ReceiveViewController targetController.data = "hello from ReceiveVC !" }} 
  2. Edite el identificador segue a "showNavigationController"

captura de pantalla

  1. En su ReceiveViewController agregar

esta

 var data : String = "" override func viewDidLoad() { super.viewDidLoad() println("data from ReceiveViewController is \(data)") } 

Por supuesto, puede enviar cualquier otro tipo de datos (int, Bool, JSON …)

Aquí está la respuesta para Swift 3:

 let svc = segue.destination as? UINavigationController let controller: MyController = svc?.topViewController as! MyController controller.myProperty = "Hi there" 

Respuesta completa con optional binding y Swift 3:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let navigationViewController = segue.destination as? UINavigationController, let myViewController = navigationVC.topViewController as? MyViewControllerClass { myViewController.yourProperty = myProperty } } 

Un forro en Swift 3:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let vc = segue.destination.childViewControllers[0] as? FooController { vc.variable = localvariable } }