2012-04-13 2 views
55

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

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

Должен ли я позвонить removeFromSuperview перед вызовом removeChildViewController?

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

ответ

40

Короткий ответ: «Да, да». Иерархия представлений и вид контроллер иерархия по-прежнему независимы. API-интерфейс сдерживания просто позволяет представлениям других контроллеров представать в представлении родительского контроллера чистым и последовательным образом.

Вы можете найти немного в Apple's docs here ... это соответствующий отрывок из «Контейнер View Controllers Устройте Содержание Другие Список контроллеров» Раздел:

Контейнер управляет иерархии видов как другой точки зрения контроллеры. Контейнер также может добавлять представления любого из его дочерних элементов в свою иерархию представлений. Контейнер решает, когда такое представление добавлено и как оно должно быть настроено в соответствии с иерархией представлений контейнера, но в остальном контроллер дочернего представления остается ответственным за представление и его подпункты.

Если у вас есть доступ, я настоятельно рекомендую проверить WWDC 2011 видео под названием "Реализация UIViewController Сдерживание" (watch in Safari | view in iTunes).

+1

Большое спасибо.Если я уничтожу контейнер, могу ли я также вызвать removeViewFromSuperview? Или даже removeChildViewController? – Ricardo

80

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]; 

} 

Official resource at developer.apple.com

+1

Очень полезно, что категория. Большое спасибо. – Ricardo

+0

Именно то, что я искал! Спасибо Peter –

+0

+1 Категория очень полезна. Спасибо. –

2

Добавление к ответу Петра: одна причина, я нашел для вызова addChildViewController перед тем addSubview было то, что когда addSubview называется то viewDidLoad ребенка получить называеться, а в некоторых случаях вы будете хотеть иметь иерархию родитель-ребенок правильно настроенных в этой точке. Если это не будет сделано, то во время дочернего метода viewDidLoad свойство parentViewController будет равно нулю.

Смежные вопросы