2015-12-15 1 views
7

Je développe une application pour iPad Pro. Dans cette application, containerView utiliser pour ajouter views supplémentaires et interagir avec eux.Déléguer en utilisant Container View dans Swift

D'abord, je créé un protocole:

protocol DataViewDelegate { 
    func setTouch(touch: Bool) 
} 

Puis, j'ai créé mon premier contrôleur de vue

enter image description here

import UIKit 

class ViewController: UIViewController, DataViewDelegate { 

    @IBOutlet var container: UIView! 
    @IBOutlet var labelText: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    func setTouch(touch: Bool) { 
     if touch == true { 
      labelText.text = "Touch!" 
     } 
    } 

}

Et enfin, je créé une vue cela sera intégré dans containerView.

enter image description here

import UIKit 

class ContainerViewController: UIViewController { 

    var dataViewDelegate: DataViewDelegate? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func touchMe(sender: AnyObject) { 
     dataViewDelegate?. setTouch(true) 
    } 

}

Mais pour une raison quelconque, rien ne se passait, le premier contrôleur de vue ne reçoit rien en fonction setTouch.

Ma question est: Dans ce cas, en utilisant un conteneur, comment puis-je effectuer la communication entre deux ViewsControllers?

+0

Pour communiquer entre vue des contrôleurs, vous pouvez utiliser la délégation, comme vous faites. Cependant, vous devriez lire le guide de programmation UIViewController de Apple https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/DesignTips.html pour les meilleures pratiques, en particulier la section intitulée «Faire de chaque contrôleur de vue une île». – beyowulf

Répondre

4

On dirait que vous avez défini le délégué, mais n'avez pas défini le délégué. Cela m'arrive tout le temps.

+0

Je suis au début des protocoles et des délégués. Comment puis-je définir le délégué? – James

+0

Vous pouvez définir le délégué dans votre vue parent prepareForSegue – beyowulf

17

Comme @nwales, vous n'avez pas encore défini le délégué. Vous devez définir le délégué dans la fonction prepareForSegue sur votre premier viewController (qui contient le conteneur viewContainer)

Sélectionnez d'abord le segment d'intégration et définissez un identificateur dans l'inspecteur d'attributs. Ensuite, dans le parentViewController mettre en œuvre le fonc prepareForSegue comme ceci:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
    if(segue.identifier == "the identifier"){ 
     let embedVC = segue.destinationViewController as! ContainerViewController 
     embedVC.dataViewDelegate = self 
    } 
}