Подтвердить что ты не робот

Должен ли я вызвать addSubview после вызова addChildViewController?

Я пытаюсь создать контроллер контейнера, используя iOS5 и новые методы, такие как addChildViewController.

Мне нужно позвонить addSubview после вызова addChildViewController?

Мне нужно позвонить removeFromSuperview перед вызовом removeChildViewController?

Я ничего не вижу об этом в документах Apple. Как вы думаете?

4b9b3361

Ответ 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.