Как перейти между модальными контроллерами вида и убрать скрытый? - PullRequest
0 голосов
/ 24 августа 2018

Контроллер основного вида (M) представляет модальный контроллер вида (A). Другой модальный контроллер представления (B) должен быть представлен. Переход должен быть из (A) в (B) без отображения (M). После перехода в (B) скрытый (A) должен быть деинициализирован. Как этого достичь?

Я ищу решение, основанное на коде, Interface Builder / Storyboard здесь не используется.

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

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Другой ответ, потому что это слишком долго для комментария.

О, теперь вопрос совершенно другой.Вы не можете достичь того, что вы хотите, так, как вы хотите.Поскольку в документации указано, что:

"Например, полноэкранное представление должно быть выполнено контроллером представления, который сам покрывает весь экран. Если текущий контроллер представления не может выполнить запрос,он пересылает запрос вверх по иерархии контроллера представления своему ближайшему родителю, который затем может обработать или переслать запрос ".

Следовательно, вы не можете деинициализировать (A) с сохранением (B), если вы представилиB из A. A должен быть отклонен, чтобы позволить M присутствовать (A).

Тем не менее, вы можете достичь этого, не представляя модальный контроллер представления, но имея childViewControllers [(A), (B)] в вашем M и анимируя их появления в (M), затем просто удалите (A)когда это необходимо.

0 голосов
/ 24 августа 2018

Прежде всего вы должны понять, что если вы удалите скрытый модальный View Controller (A), который представил ваш (B), то (B) также уволит.

Поскольку вы просили удалить (A) из (B), вам нужно передать родительский элемент контроллера представления, который вы хотите отклонить, в вашем случае (M) является родительским для (A), поэтому ваш(B), должен знать (M).Затем вы делаете

(M).dismiss(animated: true, completion: nil)

, что означает, что контроллер представления M отклонит свой дочерний контроллер представления, который (A) для вашего случая.

Основной момент здесьэто вызвать dismiss на родительском контроллере представления.Объяснение можно найти в описании увольнения, предоставленном Apple (я выделил части, вы должны обратить ваше внимание): -

*

Отклоняет контроллер представления, который был представлен модальнопросмотр контроллера. Представляющий контроллер представления отвечает за отклонение представленного контроллера .Если вы вызываете этот метод на самом представленном контроллере представления, UIKit просит представляющий контроллер представления обработать отклонение .Если вы представляете несколько контроллеров представления подряд, тем самым создавая стек представленных контроллеров представления, вызов этого метода для контроллера представления, расположенного ниже в стеке, отклоняет его непосредственный дочерний контроллер представления и все контроллеры представления выше этого потомка в стеке .Когда это происходит, только самый верхний вид отклоняется в анимационном режиме;любые промежуточные контроллеры представления просто удаляются из стека.Самое верхнее представление отклоняется, используя его модальный стиль перехода, который может отличаться от стилей, используемых другими контроллерами представления ниже в стеке.Если вы хотите сохранить ссылку на представленный контроллер представления контроллера, получите значение в свойстве presentViewController перед вызовом этого метода.Обработчик завершения вызывается после вызова метода viewDidDisappear (_ :) в представленном контроллере представления.

*

...