In WWDC 2011 Session 102, Apple introduced View Controller Containment, which is the ability to create custom view controller containers, analogous to UITabBarController
, UINavigationController
, and the like.
I watched the examples several times. There are a flurry of methods associated with this pattern, but it was a little hard to figure them out exactly. I'm going to post here what I think is going on and see if the community will confirm or disconfirm my suspicions.
Scenario 1: Moving from no parent to a new parent view controller
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
Do the first two lines have to occur in the order given, or can they be reversed?
Scenario 2: Moving from a parent view controller to no parent view controller
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
Is it also necessary to call [vc didMoveToParentViewController:nil]
? The examples in Session 102 did not do this in this scenario, but I don't know whether that was an omission or not.
Scenario 3: Moving from one parent view controller to another
This will likely occur in the following way, because the logic in each parent view controller will be encapsulated.
// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
Questions
My main question is this: Is this how view controller containment should work, in general? Are the mechanics given above correct?
Is it necessary to call willMoveToParentViewController
before calling addChildViewController
? This seems like the logical order to me, but is it strictly necessary?
Is it necessary to call didMoveToParentViewController:nil
after calling removeFromParentViewController
?
The
UIViewController
docs are pretty clear on when and when not to callwillMove
/didMove
methods. Check out the "Implementing a Container View Controller" documentation.The docs say, that if you do not override
addChildViewController
, you do not have to callwillMoveToParentViewController:
method. However you do need to call thedidMoveToParentViewController:
method after the transition is complete. "Likewise, it is is the responsibility of the container view controller to call thewillMoveToParentViewController:
method before calling theremoveFromParentViewController
method. TheremoveFromParentViewController
method calls thedidMoveToParentViewController:
method of the child view controller."Also, there is an example worked out here and sample code here.
Good Luck
This part is not correct:
According to the docs:
So you don't need the
[vc willMoveToParentViewController:self]
call. It is done automatically when you call[self addChildViewController:vc]
. Here's the code sample again:For removing view controllers:
Presumably this call is
[oldVC didMoveToParentViewController:nil]
.