В сеансе 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
?