Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delegate using Container View in Swift

I'm developing an app for iPad Pro. In this app, containerView use to add additional views and interact with them.

First, I created a protocol:

protocol DataViewDelegate {
    func setTouch(touch: Bool)
}

Then, I created my first 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!"
        }
    }

}

And finally, I created a view that will be embedded 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)
    }

}

But for some reason, nothing happened, the first view controller receives nothing in setTouch function.

My question is: In this case, using container, how can I make the communication between two ViewsControllers?

like image 967
James Avatar asked Dec 15 '15 20:12

James


2 Answers

Like @nwales said you haven't yet set the delegate. You should do set the delegate in prepareForSegue function on your first viewController (who contain the viewContainer)

First select the embed segue and set an identifier in the attributes inspector. Then in the parentViewController implement the func prepareForSegue like this:

Swift 4+:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "the identifier") {
            let embedVC = segue.destination as! ViewController
            embedVC.delegate = self
        }
    }

Below:

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
    }
}
like image 195
LHIOUI Avatar answered Nov 05 '22 13:11

LHIOUI


Looks like you defined the delegate, but have not set the delegate. This happens to me all the time.

like image 30
nwales Avatar answered Nov 05 '22 15:11

nwales