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