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