Pasar datos de los controladores de vista Xcode

Hace un par de semanas hice esta pregunta y obtuve una explicación muy detallada. Ahora me gustaría pasar los datos al primer ViewController, pero sigo atascado con el mismo método. Tengo un modal del primer VC al segundo, donde me gustaría editar un conjunto de cadenas, que se mostrarán en la primera vista de nuevo. Así que en mi primera vista tengo una matriz de datos, que deben pasarse al segundo para que los campos de edición muestren la información actual luego de que el usuario tiene que poder editar los contenidos de la matriz y pasar esos datos a la primera donde se muestra en las tags. Estoy usando Swift.

Mi código:

(en ViewController.swift 🙂

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { let secondVC = segue.destinationViewController as SecondViewController secondVC.namesPlayers = self.namesPlayers } 

(en SecondViewController.swift 🙂

 override func viewDidLoad() { super.viewDidLoad() labelFirstPlayer.text = namenSpelers[0] } 

Gracias

Necesitas usar un delegado. Aquí hay un ejemplo de cómo usar un delegado en Swift.

En su primer ViewController, configure su delegado cuando cargue el segundo VC:

Por ejemplo, si está utilizando el Editor de Guiones Gráfico:

 var secondViewController = (segue.destinationViewController.visibleViewController as MySecondViewControllerClass) secondViewController.delegate = self 

Escribe un protocolo y define un func para escribir tus valores

Por ejemplo, crea un archivo llamado “Protocol.swift” y escribe algo como eso:

 protocol writeValueBackDelegate { func writeValueBack(value: String) } 

Agregue la función a su FirstViewController

 func writeValueBack(value: String) { // Or any other function you need to transport data } 

Y a su ViewControllerClass

 class ViewController: UIViewController, writeValueBackDelegate 

La línea anterior no funcionará si no ha implementado todos los métodos en ViewController que definió en su archivo de protocolo.

Vaya al Controlador de segunda vista y agregue el delegado aquí:

 class SecondViewController: ViewController { // Delegate for FirstViewController // Declare as weak to avoid memory cycles weak var delegate: writeValueBackDelegate? } 

En su Controlador de Segunda Vista, ahora puede usar esto para llamar al func en el primer Controlador de Vista y pasar datos.

 delegate?.writeValueBack("That is a value") 

Estoy confundido por la respuesta usando delegates, porque me parece innecesariamente complicado. Esto es lo que hice para abrir un cuadro de diálogo Agregar reproductor en mi juego de cartas y pasar los resultados al controlador de vista llamante.

Agregar protocolo delegado (en mi caso en mi archivo Extensiones / Protocolos)

 protocol ReturnPlayerInfoDelegate { func returnPlayerInfo(playerName : String, playerType : Player.Type) } 

Luego agregué mi referencia (como una clase var) al delegado en el controlador de vista LLAMADA. Tenga en cuenta que esto no requirió que subclasificara mi llamada, o que agregara el protocolo a mi llamado Controlador de Vista:

 class AddPlayerViewController : UIViewController { static var delegate : ReturnPlayerInfoDelegate! 

y llamé al delegado en mi controlador de botón Ok:

  @IBAction func onOK(sender: UIButton) { AddPlayerViewController.delegate.returnPlayerInfo(mPlayerName.text!, playerType: mPlayerTypeActual) dismissViewControllerAnimated(true, completion: nil) } 

Ahora implementé el delegado en CALLING ViewController:

 class FiveKings : UIViewController, UIGestureRecognizerDelegate, UIPopoverPresentationControllerDelegate ,UITextViewDelegate , ReturnPlayerInfoDelegate { ... override func viewDidLoad() { super.viewDidLoad() AddPlayerViewController.delegate = self ... func returnPlayerInfo(playerName : String, playerType : Player.Type) { mGame.addPlayer(playerName, newPlayerClass: playerType, fKActivity: self) } 

Esto funciona muy bien. ¿Ve algún problema con mi implementación?

Espero que esto te ayudará

Este es el segundo controlador desde el que desea devolver datos a push. SecondView.swift

 @objc protocol returnDataProtocol { func returnStringData(myData: String) } class SecondView: UIViewController { weak var delegate: returnStringData? @IBAction func readyButtonPressed(sender: AnyObject) { // Do what you want here delegate?.returnStringData("Euro/Dollar etc....") // this function is exist in first view controller } } 

Primera vista ViewController firstView.swift

 class firstView: UIViewController, returnDataProtocol { // this function will call to second view. You can use here push method, if you are using navigation controller. override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "mySegue" { // your identifier here let controller = segue.destinationViewController as! MyPopOverController controller.delegate = self } } // here you will get return value from second view controller class func returnStringData(myData: String){ print(myData) } }