iOS - разница между pushViewController и presentModalViewController

В чем разница между вызовами presentModalViewController и pushViewController, когда:

  • для анимации задано НЕТ (даже если да, это просто стиль анимации, который можно изменить).
  • контроллер навигации определяется при представлении модального представления, поэтому по нему также можно перемещаться со стеком вызовов, ....

Это просто для того, чтобы вернуться из первого нажатого представления? Уууууууууу.....

Я думаю, что разница в другом и глубже. Нет ?




Ответы (5)


Самое важное различие касается семантики. Контроллеры модального представления обычно указывают, что пользователь должен предоставить некоторую информацию или что-то сделать. Эта ссылка объясняет это более подробно: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html

Вот еще одно, менее абстрактное различие, о котором они говорят:

«Когда вы представляете модальный контроллер представления, система создает отношения «родитель-потомок» между контроллером представления, который выполнял представление, и контроллером представления, который был представлен. В частности, контроллер представления, который выполнял представление, обновляет свое свойство modalViewController, чтобы оно указывало на его представленный (дочерний) контроллер представления. Точно так же представленный контроллер представления обновляет свое свойство parentViewController, чтобы оно указывало на контроллер представления, который его представил».

Также см. эту тему: почему присутствует контроллер модального представления?

person aleph_null    schedule 08.11.2011

Не обращая внимания на переходы/анимации и то, как все устроено за кулисами (что хорошо обсуждается в ответе aleph_null), единственное отличие, с которым сталкивается пользователь, — это возможность автоматически вернуться к предыдущему представлению с помощью панели навигации.

Если вы используете pushViewController, вы автоматически получите кнопку «Назад» на панели навигации. Если вы используете presentModalViewController, вы этого не сделаете, и, как правило, вам придется реализовать свои собственные элементы управления и/или обратные вызовы для обработки закрытия контроллера.

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

Если вам интересно, почему такая разница, я не могу ответить. Лично я считаю, что фреймворки, предоставляющие унифицированный API для перехода с одного контроллера на другой (например, cocos2d или Android), имеют гораздо больше смысла.

person aroth    schedule 08.11.2011
comment
Это самое главное отличие! - person Ryan Pierce; 17.08.2017

Взгляните на viewControllers на изображении

  • Два верхних контроллера представления (вход и отправка) в левом верхнем углу отсоединены от tabBarController и NavigationController.
  • Остальные viewController встроены в NavigationController. Они каким-то образом принадлежат естественному потоку приложения.

Теперь вы должны спросить себя

Нужно ли мне всегда показывать страницу входа + отправки каждый раз? Для пользователя было бы головной болью каждый раз заходить в систему, даже если он входил в систему в последний раз. Эти 2 экрана действительно не соответствуют естественному потоку экранов. Так что же нам делать? Мы просто добавляем их модально, используя presentViewController

Однако для остальных viewController мы хотим оставить их внутри 2 навигации, чтобы мы могли легко переходить назад и вперед, поэтому мы используем pushViewController

введите здесь описание изображения

Для получения дополнительной информации я рекомендую вам посмотреть это видео. выбран из этого отличного ответа. Это достойно внимания.

person Honey    schedule 18.09.2016

Это то, что говорит мой опыт: если вы хотите управлять иерархией представлений, лучше используйте pushViewController в контроллере навигации. Он работает как стек контроллеров представления в контроллере навигации. Однако, если требуется просто показать представление о выполнении некоторых действий на родительском контроллере представления, то лучший способ - представить его модально. Если вам нужна сложная логика push-pop, всегда отдавайте предпочтение pushViewController.

person GhostCode    schedule 05.09.2013

UINavigationController используются, когда вы хотите иметь какое-то иерархическое представление ваших данных (т.е. детализировать). Они работают с использованием стека подклассов UIViewController. Каждый раз, когда вы «детализируете», вы просто добавляете в стек еще один контроллер представления. Затем логика «назад» — это просто вопрос извлечения контроллеров представления из стека.

Вы можете проверить эту ссылку: http://www.icocodeblog.com/2011/10/11/back-to-basics-an-introduction-to-view-controllers/

person prohuutuan    schedule 28.05.2013