¿Cómo se pasan los datos entre los controladores de vista en Swift?

Intenté crear variables globales y actualizar la información cuando se carga la vista pero no se están procesando los datos.

VARIABLES GLOBALES

var viewName:String = "" var viewDuration:String = "" var viewPeriod:String = "" var viewMinAmp:String = "" var viewMaxAmp:String = "" var viewStep:String = "" var viewType:String = "" 

¿Hay una manera más eficiente de pasar información que las variables globales?

 @IBOutlet var txtName: UITextField! @IBOutlet var txtDuration: UITextField! @IBOutlet var txtPeriod: UITextField! @IBOutlet var txtMinAmp: UITextField! @IBOutlet var txtMaxAmp: UITextField! @IBOutlet var txtStep: UITextField! @IBOutlet var txtType: UITextField! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. setInfo(viewName, duration: viewDuration, period: viewPeriod, minAmp: viewMinAmp, maxAmp: viewMaxAmp, step: viewStep, type: viewType) } func setInfo(name: String, duration: String, period: String, minAmp: String, maxAmp: String, step: String, type: String) { txtName.text = name txtDuration.text = duration txtPeriod.text = period txtMinAmp.text = minAmp txtMaxAmp.text = maxAmp txtStep.text = step txtType.text = type } 

Una solución sería anular prepareForSegue (segue: sender 🙂 desde el controlador de vista que contiene los datos que desea pasar al controlador de vista de destino.

 override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { if (segue.identifier == "YourSegueName") { //get a reference to the destination view controller let destinationVC:ViewControllerClass = segue.destinationViewController as! ViewControllerClass //set properties on the destination view controller destinationVC.name = viewName //etc... } } 

Para Swift 3.0

 final class Shared { static let shared = Shared() //lazy init, and it only runs once var stringValue : String! var boolValue : Bool! } 

Para establecer stringValue

 Shared.shared.stringValue = "Hi there" 

para obtener stringValue

  if let value = Shared.shared.stringValue { print(value) } 

Para la versión de Swift debajo de 3.0

Puede pasar datos entre vistas usando la clase singleton. Es una manera fácil y eficiente. Aquí está mi clase ShareData.swift

 import Foundation class ShareData { class var sharedInstance: ShareData { struct Static { static var instance: ShareData? static var token: dispatch_once_t = 0 } dispatch_once(&Static.token) { Static.instance = ShareData() } return Static.instance! } var someString : String! //Some String var selectedTheme : AnyObject! //Some Object var someBoolValue : Bool! } 

Ahora en mi ViewControllerOne puedo establecer la variable anterior.

 //Declare Class Variable let shareData = ShareData.sharedInstance override func viewDidLoad() { self.shareData.someString ="Some String Value" } 

Y en mi ViewControllerTwo puedo acceder a someString como

 let shareData = ShareData.sharedInstance override func viewDidLoad() { NSLog(self.sharedData.someString) // It will print Some String Value } 

Personalmente, prefiero los siguientes modos:

  • Si desea avanzar entre dos controladores de vista (de A a B), como -pushViewController: animado: en la navegación, puede definir una propiedad de modelo para el Controlador B y exponerlo públicamente, luego establezca esta propiedad explícitamente antes de saltar del Controlador A, es bastante sencillo;

  • En caso de que quiera saltar hacia atrás desde el Controlador B hacia A, use el modo Delegado + Protocolo. El controlador B borra un protocolo público y posee una propiedad de “delegado”, cualquier objeto que desee ser el delegado del controlador B cumplirá e implementará su protocolo (opcionalmente). luego, antes del salto hacia atrás, el Controlador B hace que su delegado realice ciertas acciones enumeradas en el protocolo, los datos podrían transferirse de esta manera;

  • Bajo ciertas circunstancias, es posible que desee transferir datos desde un Controlador (o controladores) a otros Controladores múltiples, use el Mecanismo de Notificación si este es el caso.

Apple tiene instrucciones detalladas sobre el modo de delegado, el modo de notificación en la documentación oficial, compruébalo en XCode, 🙂

Solo necesita seguir 3 pasos, supongamos que desea pasar datos de ViewControllerA a ViewControllerB:

  1. crear una transición entre ViewControllerA y ViewControllerB
  2. nombre el segue con un Identificador en el inspector de atributos del mismo
  3. anular el prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) en ViewControllerA

Para el paso # 3 ,:

  • si no está utilizando swift 2.1 , por favor siga la respuesta de @Scott Mielcarski a esta pregunta
  • para personas que están usando swift 2.1 , o que obtienen el error “No se puede convertir el valor del tipo ‘UIViewController’ al tipo especificado ‘su nombre de clase de controlador de vista’, después de seguir la respuesta de @Scott Mielcarski a esta pregunta , use : let destinationVC:ViewControllerClass = segue.destinationViewController as! ViewControllerClass lugar de let destinationVC:ViewControllerClass = segue.destinationViewController

    Esto se prueba en Swift 2.1.1 y funciona para mí.