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

Когда следует использовать addChildViewController vs pushViewController

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

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

addChildViewController/removeFromParentViewController
используется с @property (неатомным, только для чтения) NSArray * childViewControllers и [self transitionFromViewController:currentView toViewController:nextView duration: options: animations: completion:];

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

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

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

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

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

4b9b3361

Ответ 1

Да, 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: для обмена одним контроллером представления для другого, необязательно с предоставлением анимации.