Должен ли я вызвать addSubview после вызова addChildViewController?
Я пытаюсь создать контроллер контейнера, используя iOS5
и новые методы, такие как addChildViewController
.
Мне нужно позвонить addSubview
после вызова addChildViewController
?
Мне нужно позвонить removeFromSuperview
перед вызовом removeChildViewController
?
Я ничего не вижу об этом в документах Apple.
Как вы думаете?
Ответы
Ответ 1
Краткий ответ: "Да и да". Иерархия представления и иерархия контроллера представления все еще независимы. API сдерживания просто позволяет представлениям других контроллеров представлять себя в представлении родительского контроллера чистым и единообразным способом.
Вы можете найти немного в Apple документах здесь... это соответствующий отрывок из раздела "Контроллеры представления контейнера. Упорядочить содержимое других контроллеров представления":
Контейнер управляет иерархией представления так же, как это делают другие контроллеры представления. Контейнер также может добавлять представления любого из его дочерних элементов в свою иерархию представлений. Контейнер решает, когда добавить такое представление и как его размер должен соответствовать иерархии представления контейнеров, но в противном случае контроллер дочернего представления остается ответственным за представление и его подпредставления.
Если у вас есть доступ, я настоятельно рекомендую проверить видео WWDC 2011 под названием "Внедрение UIViewController Containment" (загрузите его из Apple Archive Video Archive).
Ответ 2
1) Должен ли я вызвать addSubview после вызова addChildViewController?
Да
2) Должен ли я вызвать removeFromSuperview перед вызовом removeChildViewController?
Не совсем
Вы должны вызвать removeFromParentViewController:
вместо removeChildViewController:
Вы также должны позвонить willMoveToParentViewController:
Для добавления/удаления вы можете обратиться к этой замечательной категории:
UIViewController + Container
- (void)containerAddChildViewController:(UIViewController *)childViewController {
[self addChildViewController:childViewController];
[self.view addSubview:childViewController.view];
[childViewController didMoveToParentViewController:self];
}
- (void)containerRemoveChildViewController:(UIViewController *)childViewController {
[childViewController willMoveToParentViewController:nil];
[childViewController.view removeFromSuperview];
[childViewController removeFromParentViewController];
}
Официальный ресурс на developer.apple.com
Ответ 3
Добавление к Питеру:
одна из причин, по которой я нашел для вызова addChildViewController
до addSubview
, было то, что при вызове addSubview
вызывается вызов viewDidLoad
дочернего элемента, и в некоторых случаях вам нужно правильно установить иерархию родительского ребенка это пункт. Если это не будет сделано, то во время дочернего объекта viewDidLoad свойство parentViewController будет равно nil.