В сеансе 102 WWDC 2011 Apple представила View Controller Containment, которая представляет собой возможность создавать пользовательские контейнеры контроллера просмотра, аналогичные 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
?