В чем разница между модальными и push-переходами в раскадровке?

179

Может кто-нибудь объяснить мне, в чем точная разница между modalи pushsegue?

Я знаю, что когда мы используем pushsegue, он добавляется в стек, поэтому, когда мы продолжаем pushего использовать, он продолжает занимать память?

Может кто-нибудь показать мне, как эти два реализованы?

ModalСеги могут быть созданы простым ctrl-clickперетаскиванием к месту назначения, но когда я делаю это с pushмоим приложением, происходит сбой.

Я нажимаю на кнопку, UINavigationControllerкоторая имеет UIViewController.

Gaurav_soni
источник

Ответы:

174

Толчок Segue добавляет другой VC к навигации стека. Это предполагает, что VC, который инициирует push, является частью того же контроллера навигации, к которому принадлежит VC, который добавляется в стек. Управление памятью не является проблемой с навигационными контроллерами и глубоким стеком. Пока вы заботитесь об объектах, которые вы можете передавать из одного VC в другой, среда выполнения будет заботиться о стеке навигации. Смотрите изображение для визуальной индикации: NavStack

Модальный Segue только один VC представляя другой VC модально. VC не обязательно должны быть частью навигационного контроллера, а VC, представляемый модально, как правило, считается «дочерним» для представляющего (родительского) VC. Модально представленный VC обычно не содержит никаких панелей навигации или панелей вкладок. Представляющий VC также ответственен за отклонение модального VC, который он создал и представил.

Надеюсь это поможет.

Л.Дж. Уилсон
источник
1
@ EIJay спасибо за отличное объяснение. Еще один вопрос, когда мне нужно использовать модал, а когда использовать push segue?
Gaurav_soni
43
Обычно, когда вы хотите показать подробный вид сводного представления, используйте контроллер навигации и Push Segues. Если «родительское» представление на самом деле не относится к данным с «дочерним», то используйте модальное. Хорошим примером модального представления будет представление входа в систему. Представление «Вход в систему» ​​на самом деле не имеет никакого отношения в отношении данных к представлению «родитель».
ЖЖ Уилсон
5
@TJ Да, вы можете создавать «модельные цепочки». Отказ от VC вниз по цепочке приводит к удалению всех VC вверх по цепочке - пользователь видит только отклонение верхнего VC (при включении анимации). Это как навигационные контроллеры.
Константино Царухас
3
@jchatard Да. Пока ваш переход модальный, в раскадровке вы увидите, что панель навигации не наследуется. Так что просто нажмите на первый VC из имеющейся у вас модальной цепочки, а затем выберите меню Editor -> Embed In -> Navigation Controller. Это установит вам навигационный контроллер, который будет общим для всей вашей модальной цепочки. Не то, чтобы в этот момент только режим отображения контроллера навигации был «модальным», тогда как все сегменты внутри вашей модальной цепочки должны быть «проталкиваемыми».
HpTerm
3
Push может использоваться только в том случае, если VC, от которого вы переходите, использует навигационный контроллер. Попробуйте нажать на VC, который не встроен в контроллер навигации, и он выдаст исключение. Таким образом, это не имеет ничего общего с тем, насколько тесно данные связаны между родителем и ребенком, это просто связано с тем, используете ли вы навигационный контроллер для управления своими ВК. Вы можете сделать то же самое вручную, используя сегменты, используя модальные переходы.
smileBot
22

Обновление Swift 3.0 и XCode 8.2.1

1. Push Segue

Push segue было переименовано в Show segue. Чтобы создать push-переход, родительский контроллер представления должен быть встроен в контроллер навигации. Контроллер навигации предоставляет панель навигации. Как только вы соедините два контроллера вида с push segue, дочерний контроллер вида автоматически будет иметь панель навигации вверху. Контроллер дочернего представления будет добавлен поверх стека навигации.

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

Push Segue также предоставляет функции по умолчанию. Дочерний контроллер представления будет иметь кнопку возврата, которая возвращает вас к родительскому контроллеру представления. Вы также можете провести вправо, чтобы открыть дочерний контроллер вида. Анимация для push-перехода похожа на скольжение страниц по горизонтали.

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

Несмотря на то, что вам разрешено выполнять push-переход от контроллера представления, отсутствующего в контроллере навигации, при этом вы потеряете все функции, такие как панель навигации, анимация, жесты и т. Д. В этом случае вы должны сначала встроить свой родительский контроллер представления в контроллер навигационного представления, а затем выполнить переход на дочерние контроллеры представления.

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

2. Модальная Сегу

Модальный переход (то есть присутствующий в модальном порядке), с другой стороны, представлен поверх текущего контроллера вида. Дочерний контроллер вида не будет наследовать контроллер вида навигации, поэтому панель навигации будет потеряна, если вы представите модальный переход от контроллера вида с контроллером вида навигации. Вы должны снова встроить дочерний контроллер представления в контроллер навигации и запустить новый стек навигации, если хотите вернуть его обратно. Если вы хотите вернуться к родительскому контроллеру представления, вы должны реализовать это самостоятельно и вызывать dismissиз кода.

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

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

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

Fangming
источник
6

Просмотр толчка должен быть встроен в navigationController.

Нажмите на свой master view, затем в строке меню выберите:

EDITOR->embed in->navigationController
Симона Пистеккия
источник
Неправильно, pushViewможно также построить БЕЗ navigationControllerи этот ответ неполон!
Дакш Гаргас
1

Это перемещение элементов управления с использованием пользовательских методов push и segue для раскадровки. Совет по истории

А Модал - это способ навигации по представлениям без использования раскадровок.

Pushkraj
источник
Как создать модальный переход без использования раскадровки?
jianpx
@jianpx: Вы можете переходить только тогда, когда вы используете раскадровки. В противном случае вы можете использовать контроллер навигации или PresentModalViewController для переключения между представлениями.
Пушкрай
@ Пушкрай спасибо. Таким образом, вы имеете в виду, что нет способа создать переход по коду?
jianpx
@jianpx: не требуется. Segue требуется только при использовании раскадровок.
Пушкрай