Когда использовать addChildViewController против pushViewController - PullRequest
34 голосов
/ 10 ноября 2011

Я только что посмотрел презентацию 2011 WWDC "Внедрение UIViewController Containment" ( вот ссылка на видео )

Они упомянули оба этих способа добавления viewController на экран, и я был бы признателен за некоторые разъяснения о лучших практиках ...

addChildViewController / removeFromParentViewController
, используемый с NSproray (nonatomic, readonly) NSArray * childViewControllers и [self transitionFromViewController:currentView toViewController:nextView duration: options: animations: completion:];

pushViewController: animated: / popViewControllerAnimated
они действительно быстро пропустили это в презентации

В моих приложениях я использую все пользовательские viewControllers, и до сегодняшнего дня мне всегда удавалосьих с помощью:

[nextController performSelector:@selector(setDelegate:) withObject:self];
[currentPageController.view removeFromSuperview];
[self.view addSubview:nextController.view];

Но теперь я понимаю, что это плохая практика, и мне интересно, как правильно использовать addChildViewController и как правильно использовать pushViewController«?

Я очень ценю ваши мысли по этому поводу!

1 Ответ

73 голосов
/ 10 ноября 2011

Да, pushViewController: - для контроллеров навигации, которые управляют стеком контроллеров представления.addChildViewController:, с другой стороны, является частью функции iOS 5, называемой «сдерживание контроллера представления».

Основная идея заключается в том, что вы можете встроить свои контроллеры представления в другие свои собственные контроллеры представления (например, когдаперенести приложение iPhone на iPad) и, таким образом, легко реализовать свою собственную реализацию таких вещей, как контроллеры навигации, контроллеры с разделенными представлениями и т. д.

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

Глядя на свою реализацию, вы также должны подумать о том, чего вы действительно хотите достичь этим.Навигационный контроллер может быть правильным, или вы можете даже показывать следующий контроллер модально (см. https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PresentingaViewController.html). При использовании этих методов (например, навигационных контроллеров и модальных представлений) преимущество заключается в том, что пользователь уже знаком с этими методами навигации..

В любом случае https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ - хорошее прочтение о том, как переходить между контроллерами представления.

При использовании сдерживания контроллера представления вы, в основном, должны добавить представление к содержащему представлению.как обычно (это должно быть сделано, даже если контроллер добавлен). Затем вы используете addChildViewController: для добавления дочернего контроллера представления к окружающему. Вы также должны уведомить дочерний контроллер с помощью didMoveToParentViewController:, что он был установленв другой контроллер. Вы также можете использовать transitionFromViewController:toViewController: для замены одного контроллера представления на другой, при желании предоставляя анимацию.

...