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é.
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?
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
}
}
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.