2015-12-15 15 views
7

Ich entwickle eine App für iPad Pro. In dieser App containerView verwenden, um zusätzliche views hinzufügen und interagieren mit ihnen.Delegate mit Container View in Swift

Zuerst habe ich ein Protokoll erstellt:

protocol DataViewDelegate { 
    func setTouch(touch: Bool) 
} 

Dann habe ich meine erste View-Controller

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

}

erstellt

Und schließlich habe ich einen Blick das wird in containerView eingebettet werden.

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

}

Aber aus irgendeinem Grund, es ist nichts passiert, die erste View-Controller nichts in setTouch Funktion erhält.

Meine Frage ist: In diesem Fall, mit Container, wie kann ich die Kommunikation zwischen zwei ViewsControllers machen?

+0

zwischen View-Controller kommunizieren Sie Delegierung verwenden können, wie Sie tun. Sie sollten jedoch den UIViewController-Programmierleitfaden von Apple https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/DesignTips.html lesen, um Best Practices zu erfahren, insbesondere den Abschnitt mit dem Titel "Machen Sie jeden View Controller zu einem Island". – beyowulf

Antwort

4

Sieht so aus, als hätten Sie den Delegaten definiert, aber den Delegaten nicht festgelegt. Das passiert mir die ganze Zeit.

+0

Ich bin in den frühen Stadien der Protokolle und Delegierten. Wie kann ich den Delegierten festlegen? – James

+0

Sie können den Delegaten in prepareforSegue des übergeordneten View-Controllers festlegen – beyowulf

17

Wie @nwales sagte, Sie haben noch nicht den Delegierten festgelegt. Sie sollten den Delegaten in der prepareForSegue-Funktion auf Ihrem ersten viewController festlegen (die den viewContainer enthalten).

Wählen Sie zuerst den Embed-Abschnitt aus, und legen Sie im Attribute-Inspector einen Bezeichner fest. Dann in der parent die func prepareForSegue wie folgt implementieren:

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