Как работает View Controller Containment в iOS 5?

На 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?

107
задан Bartłomiej Semańczyk 26 October 2015 в 08:33
поделиться