perform swift swift2 segue uistoryboardsegue swift-protocols

swift - perform - Pasar datos entre ViewController y ContainerViewController



perform segue swift 4 (2)

Lo resolví con este código

Para enviar datos desde ViewController -> ContainerViewController

Class ViewController : UIViewController { func sendData(MyStringToSend : String) { let CVC = childViewControllers.last as! ContainerViewController CVC.ChangeLabel( MyStringToSend) } }

en su ContainerViewController

Class ContainerViewController : UIViewController { @IBOutlet weak var myLabel: UILabel! func ChangeLabel(labelToChange : String){ myLabel.text = labelToChange } }

Para enviar datos desde ContainerViewController -> ViewController

Class ContainerViewController : UIViewController { func sendDataToVc(myString : String) { let Vc = parentViewController as! ViewController Vc.dataFromContainer(myString) } }

y en ViewController

Class ViewController : UIViewController { func dataFromContainer(containerData : String){ print(containerData) } }

Espero que esto ayude a alguien.

Estoy trabajando en una aplicación y necesito pasar datos entre view y containerView. Necesito enviar datos y recibir datos de ambas Vistas.

Déjame explicarte mejor:

Puedo cambiar Label Master (toque el botón del contenedor) por protocolo , pero no puedo cambiar Label Container (toque el botón Master). Lo que sucede es que el Maestro se conecta con el contenedor por un seguidor. Pero no tiene que seguir un contenedor que enlace al maestro.

Traté de agregar pero seguir, pero funcionó.

El controlador de vista maestro:

import UIKit protocol MasterToContainer { func changeLabel(text:String) } class Master: UIViewController, ContainerToMaster { @IBOutlet var containerView: UIView! var masterToContainer:MasterToContainer? @IBOutlet var labelMaster: UILabel! override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "containerViewSegue" { let view = segue.destinationViewController as? Container view!.containerToMaster = self } } override func viewDidLoad() { super.viewDidLoad() } @IBAction func button_Container(sender: AnyObject) { masterToContainer?.changeLabel("Nice! It''s work!") } func changeLabel(text: String) { labelMaster.text = text } }

El controlador de vista de contenedor:

import UIKit protocol ContainerToMaster { func changeLabel(text:String) } class Container: UIViewController, MasterToContainer { var containerToMaster:ContainerToMaster? @IBOutlet var labelContainer: UILabel! override func viewDidLoad() { super.viewDidLoad() } @IBAction func button_Master(sender: AnyObject) { containerToMaster?.changeLabel("Amazing! It''s work!") } func changeLabel(text: String) { labelContainer.text = text } }

¿Alguien me puede ayudar?


Todo lo que necesita hacer es mantener una referencia a Container en su controlador de vista maestro.

Es decir, debe agregar una variable de instancia al Master que contendrá una referencia al controlador de vista , no solo a la vista. Deberá configurarlo en prepareForSegue .

Entonces, el comienzo del Controlador Master View se vería así:

class Master: UIViewController, ContainerToMaster { @IBOutlet var containerView: UIView! var containerViewController: Container? @IBOutlet var labelMaster: UILabel! override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "containerViewSegue" { containerViewController = segue.destinationViewController as? Container containerViewController!.containerToMaster = self } }

Y luego, en la función de su botón, simplemente cambie la etiqueta con la variable que acaba de agregar.

Ejemplo:

@IBAction func button_Container(sender: AnyObject) { containerViewController?.changeLabel("Nice! It''s work!") }

Esto significa que también puede deshacerse de su protocolo MasterToContainer .

Probé este código, así que sé que funciona, pero desafortunadamente soy un desarrollador de Objective-C y no sé nada sobre las mejores prácticas en Swift. Así que no sé si esta es la mejor manera de hacerlo, pero ciertamente funciona.

Editar:

Aquí está el código exacto que he probado:

Master.swift:

import UIKit class Master: UIViewController, ContainerToMaster { @IBOutlet var containerView: UIView! @IBOutlet var labelMaster: UILabel! var containerViewController: Container? override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "containerViewSegue" { containerViewController = segue.destinationViewController as? Container containerViewController!.containerToMaster = self } } @IBAction func button_Container(sender: AnyObject) { containerViewController?.changeLabel("Nice! It''s work!") } func changeLabel(text: String) { labelMaster.text = text } }

Container.swift:

import UIKit protocol ContainerToMaster { func changeLabel(text:String) } class Container: UIViewController { @IBOutlet var labelContainer: UILabel! var containerToMaster:ContainerToMaster? @IBAction func button_Master(sender: AnyObject) { containerToMaster?.changeLabel("Amazing! It''s work!") } func changeLabel(text: String) { labelContainer.text = text } }