В WWDC 2011 Session 102, Apple представила View Controller Сдерживание, который является возможность создания пользовательских представлений контроллера контейнеров, аналогично UITabBarController, UINavigationControllerи тому подобное.
Я несколько раз смотрел примеры. С этим шаблоном связано множество методов, но было немного сложно понять их точно. Я собираюсь опубликовать здесь то, что, по моему мнению, происходит, и посмотрю, подтвердит или опровергнет сообщество мои подозрения.
Сценарий 1. Переход от родительского контроллера к новому родительскому контроллеру представления
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
Должны ли первые две строки располагаться в указанном порядке или их можно поменять местами?
Сценарий 2: переход от родительского контроллера представления к контроллеру родительского представления
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
Также нужно звонить [vc didMoveToParentViewController:nil]? Примеры из Сессии 102 не сделали этого в этом сценарии, но я не знаю, было ли это упущением или нет.
Сценарий 3: переход от одного родительского контроллера представления к другому
Скорее всего, это произойдет следующим образом, потому что логика в каждом родительском контроллере представления будет инкапсулирована.
// 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];
Вопросы
Мой главный вопрос: так ли вообще должно работать включение контроллера представления? Правильны ли приведенные выше механики?
Обязательно ли willMoveToParentViewControllerперед звонком звонить addChildViewController? Мне это кажется логичным, но обязательно ли это?
Обязательно ли звонить didMoveToParentViewController:nilпосле звонка removeFromParentViewController?
addChildViewControllerнужно уравновешиватьdidMoveToParentViewControllerиwillMoveToParentViewControllerуравновешиватьremoveFromParentViewController. Это именно то, что я искал. Не знаю, как я это пропустил в документации.