web-dev-qa-db-fra.com

Passer des données entre ViewController et ContainerViewController

Je travaille sur une application et j'ai besoin de transmettre des données entre view et containerView. Je dois envoyer des données et recevoir des données des deux vues.

Je m'explique mieux:

Je peux changer le Label Master (Appuyez sur le bouton Conteneur) par le protocole , mais je ne peux pas changer le Conteneur d'étiquettes (Appuyez sur le bouton principal). Ce qui se passe, c'est que le maître se connecte au conteneur par un suivant. Mais ne disposez pas d'un conteneur de suivi reliant au maître.

J'ai essayé d'ajouter mais d'enchaîner, mais cela a fonctionné.

enter image description here

Le contrôleur Master View:

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

Le contrôleur de vue de conteneur:

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

Est-ce que quelqu'un peut m'aider?

17
James

Il vous suffit de conserver une référence à Container dans votre contrôleur de vue principal.

Autrement dit, vous devez ajouter une variable d'instance à Master qui contiendra une référence à contrôleur de vue, pas seulement la vue. Vous devrez le définir dans prepareForSegue.

Le début de Master View Controller ressemblerait donc à ceci:

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

Et puis, dans la fonction de votre bouton, changez simplement l'étiquette en utilisant la variable que vous venez d'ajouter.

Exemple:

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

Cela signifie que vous pouvez également vous débarrasser de votre protocole MasterToContainer.

J'ai testé ce code, donc je sais qu'il fonctionne, mais malheureusement je suis un développeur Objective-C, et je ne sais rien des meilleures pratiques de Swift. Je ne sais donc pas si c'est la meilleure façon de procéder, mais cela fonctionne certainement.

Modifier:

Voici le code exact que j'ai testé:

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
    }
}
27
T Blank

Je l'ai résolu avec ce code

Pour envoyer des données depuis ViewController -> ContainerViewController

Class ViewController : UIViewController {

func sendData(MyStringToSend : String) {

let CVC = childViewControllers.last as! ContainerViewController
CVC.ChangeLabel( MyStringToSend)
}

}

dans votre ContainerViewController

Class ContainerViewController : UIViewController {

@IBOutlet weak var myLabel: UILabel!

func ChangeLabel(labelToChange : String){

myLabel.text = labelToChange

 }
}

Pour envoyer des données depuis ContainerViewController -> ViewController

Class ContainerViewController : UIViewController {

func sendDataToVc(myString : String) {

   let Vc = parentViewController as! ViewController
   Vc.dataFromContainer(myString)
 }

}

et dans ViewController

  Class ViewController : UIViewController {

  func dataFromContainer(containerData : String){

   print(containerData)
  }

  }

J'espère que cela aidera quelqu'un.

25
Rob