Search code examples
iosswiftdelegation

Delegation from ContainerView to parent ViewController


I have the following setup:

StartViewController has a ContainerView that contains ContainerViewController

I try to find a way to hidden an element in StartViewController after a task is performed in ContainerViewController.

For this I try to use delegation method like this:

StartViewController

class StartViewController: UIViewController, showBannerAdDelegate {

    @IBOutlet weak var bannerView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        bannerView.hidden = false
    }

    func bannerAdHidden(status: Bool) {
        bannerView.hidden = status
    }

}

ContainerViewController

protocol showBannerAdDelegate: class {
    func bannerAdHidden(status: Bool)
}

class ContainerViewController: UIViewController {

    weak var delegate: showBannerAdDelegate! = nil

    @IBAction func buttonPressed(sender: UIButton) {
        delegate.bannerAdHidden(true)
    }

}

If I presented the ContainerViewController I could do in prepareForSegue

let destination = segue.destinationViewController as! ContainerViewController
destination.delegate = self

But in this case both View Controller are always present.

What code should I add to the View Controller to make it work?

Thank you,


Solution

  • If one of the view controllers is inside a container view then it is loaded with an embed segue, which fires when the containing view controller is first loaded. The prepareForSegue method still gets called, so you can set up a delegate exactly as you've described. I always thought embed segues were a little odd (it's not really a segue, more like loading a child view controller) but that's how it works.