I recommend using delegations.
After pressing said button in your "navigation bar", let it tell the controller to change the second container view's content.
UPDATE:
In your navigation add protocol:
protocol NavigationDelegation: class {
func userDidPressSomeButton(sender: NavigationViewController)
}
class NavigationViewController: UIViewController {
...
weak var navDelegate: NavigationDelegation?
@IBAction func someButton(_ sender: Any) {
// some additional stuff
...
// send delegation
navDelegate?.userDidPressSomeButton(sender: self)
}
...
}
Inside your main controller, conform to protocol and implement the delegation:
class YourMainViewController: UIViewController, NavigationDelegation {
...
var firstEmbeddedViewController: NavigationViewController?
var secondEmbeddedViewController: SomeOtherViewController?
// Accessing your embedded controllers
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let controller = segue.destination as? NavigationViewController {
embeddedViewController = controller
// Setting your main controller to delegate to
embeddedViewController!.navDelegate = self
}
else if let controller = segue.destination as? SomeOtherViewController {
secondEmbeddedViewController = controller
}
}
// Implement the required protocol function
func userDidPressSomeButton(sender: NavigationViewController) {
// You can now talk to your second embedded view, e.g.,
secondEmbeddedViewController.someVariable = someValue
secondEmbeddedViewController.someFunction()
// You can also use the sender variable to access your navigation properties, e.g.,
// let someText = sender.buttonOutlet.textLabel?.text
}
...
}