https://www.hackingwithswift.com/example-code/uikit/how-to-use-view-controller-containment How to use view controller containment Swift version: 5.0
Paul Hudson @twostraws May 28th 2019 View controller containment allows you to embed one view controller inside another, which can simplify and organize your code. It takes four steps:
- Call addChild() on your parent view controller, passing in your child.
- Set the child’s frame to whatever you need, if you’re using frames.
- Add the child’s view to your main view, along with any Auto Layout constraints.
- Call didMove(toParent:) on the child, passing in your main view controller. In Swift code it looks like this:
addChild(child)
child.view.frame = frame
view.addSubview(child.view)
child.didMove(toParent: self)
When you’re finished with it, the steps are conceptually similar but in reverse:
- Call willMove(toParent:), passing in nil.
- Remove the child view from its parent.
- Call removeFromParent() on the child. In code, it’s just three lines:
willMove(toParent: nil)
view.removeFromSuperview()
removeFromParent()
Just for convenience you might want to consider adding a small, private extension to UIViewController to do these tasks for you – they do need to be run in a precise order, which is easily done incorrectly.
Something like this ought to do it:
@nonobjc extension UIViewController {
func add(_ child: UIViewController, frame: CGRect? = nil) {
addChild(child)
if let frame = frame {
child.view.frame = frame
}
view.addSubview(child.view)
child.didMove(toParent: self)
}
func remove() {
willMove(toParent: nil)
view.removeFromSuperview()
removeFromParent()
}
}
That’s marked @nonobjc
so it won’t conflict with any of Apple’s own code, now or in the future.