2015-12-15 17 views
7

Sto sviluppando un'applicazione per iPad Pro. In questa app, containerView utilizzare per aggiungere ulteriori views e interagire con loro.Delegare utilizzando la vista Contenitore in Swift

In primo luogo, ho creato un protocollo:

protocol DataViewDelegate { 
    func setTouch(touch: Bool) 
} 

Poi, ho creato il mio primo controller di vista

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

}

E, infine, ho creato una vista che sarà incorporato in 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) 
    } 

}

Ma per qualche motivo, non è successo niente, il primo controller della vista non riceve nulla in funzione setTouch.

La mia domanda è: In questo caso, utilizzando il contenitore, come posso effettuare la comunicazione tra due ViewsControllers?

+0

per comunicare tra i controller di vista è possibile utilizzare la delega, come si sta facendo. Tuttavia, dovresti leggere la guida alla programmazione di UIViewController di Apple https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/DesignTips.html per le migliori pratiche, in particolare la sezione "Rendi ogni controller di visualizzazione un'isola". – beyowulf

risposta

4

Sembra che tu abbia definito il delegato, ma non aver impostato il delegato. Questo mi succede tutto il tempo.

+0

Sono nelle prime fasi di protocolli e delegati. Come posso impostare il delegato? – James

+0

È possibile impostare il delegato in prepareForSegue del controllore della vista principale – beyowulf

17

Come @nwales ha detto che non hai ancora impostato il delegato. È necessario impostare il delegato nella funzione prepareForSegue sulla prima viewController (che contiene viewContainer)

Prima selezionare il comando di incorporamento e impostare un identificatore nell'ispettore attributi. Poi nel parentViewController attuare la prepareForSegue func come questo:

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