Нужно ли вызывать 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:

Для добавления / удаления вы можете обратиться к этой замечательной категории:

UIViewController + Контейнер

- (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

Добавление к ответу Петра: одна причина, которую я нашел для звонка 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

Это даст вам представление об отношениях контроллера дочернего и родительского представлений и о том, как с ними работать.

Другие вопросы по тегам