Нужно ли вызывать addSubview после вызова addChildViewController?
Я пытаюсь создать контроллер представления контейнера с помощью iOS5
и новые методы, такие как addChildViewController
,
Должен ли я позвонить addSubview
после звонка addChildViewController
?
Должен ли я позвонить removeFromSuperview
перед звонком removeChildViewController
?
Я ничего не вижу в документах Apple. Как вы думаете?
3 ответа
Краткий ответ: "Да и да". Иерархия представления и иерархия контроллера представления все еще независимы. API сдерживания просто позволяет представлениям других контроллеров представлять себя в представлении родительского контроллера чистым и единообразным способом.
Вы можете найти немного в документации Apple здесь... это соответствующий отрывок из раздела "Контроллеры представлений контейнера. Упорядочить содержимое других контроллеров представления":
Контейнер управляет иерархией представления так же, как это делают другие контроллеры представления. Контейнер также может добавлять представления любого из своих дочерних элементов в свою иерархию представлений. Контейнер решает, когда добавить такое представление и как его размер должен соответствовать иерархии представления контейнера, но в противном случае контроллер дочернего представления остается ответственным за представление и его подпредставления.
Если у вас есть доступ, я настоятельно рекомендую проверить видео WWDC 2011 под названием "Внедрение UIViewController Containment" ( смотреть в Safari | посмотреть в iTunes).
1) Должен ли я вызывать addSubview после вызова addChildViewController?
да
2) Должен ли я вызывать removeFromSuperview перед вызовом removeChildViewController?
Не совсем
Вам следует позвонить removeFromParentViewController:
вместо removeChildViewController:
Вы также должны позвонить willMoveToParentViewController:
Для добавления / удаления вы можете обратиться к этой замечательной категории:
- (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];
}
Добавление к ответу Петра: одна причина, которую я нашел для звонка addChildViewController
до addSubview
это было когда addSubview
называется тогда viewDidLoad
из дочерних get вызывается, и в некоторых случаях вы захотите правильно настроить иерархию parent-child в этой точке. Если этого не сделать, во время дочернего viewDidLoad свойство parentViewController будет равно nil.
Ниже приведен пример документации Apple.
- (void) displayContentController: (UIViewController*) content {
[self addChildViewController:content];
content.view.frame = [self frameForContentController];
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self];
}
Вы также можете ознакомиться с подробным объяснением, приведенным здесь - https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html
Это даст вам представление об отношениях контроллера дочернего и родительского представлений и о том, как с ними работать.