Отклонить все модалы в iOS с Swift 4 - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь добиться навигации, аналогичной приложению Netflix для iOS.При нажатии на фильм появляется модальное окно с кнопкой закрытия.Если в этом фильме я выбираю просмотр другого фильма, появляется второй модал, и в дополнение к кнопке закрытия появляется кнопка возврата.Я могу использовать кнопку «Назад» для отклонения одного за другим и кнопку «Закрыть» для возврата к основному экрану.

Я могу отклонить один просмотр, используя

dismiss(animated: true, completion: nil)

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

Я работаю со Swift 4.2 в Xcode 10.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

То, как вы отклоняете ViewController, не является правильным.Представляющий контроллер представления ответственен за отклонение контроллера представления.В идеале вы должны реализовать протокол в вашем представлении ViewController и исключить ваш модальный режим из вашего «представления» ViewController, а не «представленного» ViewController.

Причина, по которой ваш путь все еще работает, заключается в том, что когда ViewController вызывает self.dimiss, если нечего отклонять, UIKit делегирует его своему родителю.Если вы реализуете этот правильный путь, то после того, как вы откажетесь, ваш представляющий viewcontroller будет отклонен, следовательно, все представленные viewcontroller будут отклонены вместо последнего.

Из документов Apple:

Представляющий контроллер представления отвечает за отклонение представленного контроллера.Если вы вызываете этот метод на самом представленном контроллере представления, UIKit просит представляющий контроллер представления обработать увольнение.

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

Если вы хотите сохранить ссылку на представленный контроллер представления представления,получить значение в свойстве presentViewController перед вызовом этого метода.

Обработчик завершения вызывается после вызова метода viewDidDisappear (_ :) в представленном контроллере представления.

0 голосов
/ 15 ноября 2018

попробуйте

 self.navigationController?.viewControllers.removeAll(where: {$0.isModalInPopover})
...