Delegate using Container View in Swift

2019-03-15 18:47发布

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?

2条回答
一夜七次
2楼-- · 2019-03-15 19:21

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

查看更多
劫难
3楼-- · 2019-03-15 19:25

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:

 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
    }
}
查看更多
登录 后发表回答