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
}
}