В 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
. Это именно то, что я искал. Не знаю, как я это пропустил в документации.Эта часть неверна:
Согласно документам:
Так что
[vc willMoveToParentViewController:self]
звонок тебе не нужен . Это происходит автоматически при звонке[self addChildViewController:vc]
. Вот еще раз пример кода:Для удаления контроллеров представления:
Предположительно это звонок
[oldVC didMoveToParentViewController:nil]
.источник
didMoveToParentViewController
« сразу после вызова метода addChildViewController:», но не указывают, когда вы действительно добавляете дочернее подвид. Интересно, все ли ошибаются? Есть ли в некоторых документах Apple пример, по которому мы можем это проверить?willMoveToParentViewController
доaddChildViewController
если детали вы двигаетесь это пользовательский класс с переопределяютсяaddChildViewController
(если ваше переопределение не называет его внутренне)