Комментарии 10
Ну вот вы то наверное мне и ответите на вопрос, который не дает покоя. Вопрос не прям про создание своих транзишенов, но про
По каким причинам может отсутствовать
Ситуация: Я делаю
transitionCoordinator
, который вы упомянули в вспомогательной функции. И вопрос в следующем:По каким причинам может отсутствовать
transitionCoordinator
?Ситуация: Я делаю
push
в навигационный стэк и сразу обращаюсь к transitionCoordinator
чтобы получить возможность иметь completion block
(примеров реализации очень много в интернете). Когда вызывается completion block
я делаю модификацию стэка навигации. Достаточно редко и только на iOS 12 transitionCoordinator
отсутствует. Соответствено completion block
вызывается сразу. И в момент срабатывания completion block
, контролер, который я пушил в стэк, не присутствует в массиве viewControllers
и не является topViewController
. Другими словами навигационный контролер не знает о контролере, который мы в него запушили к моменту окончания пуша. После этого модификация стека приводит к крэшу со словами (Pushing the same view controller instance more than once is not supported), т.к. я подменяю массив viewControllers на другой, который содержит контролер, который мы изначально запушили. Этот кусок кода в продакшене обложен логами с ног до головы. Я точь-в-точь могу повторить шаги пользователя. Но закрэшить приложение у меня так и не выходит.Сложно ответить на вопрос с этой стороны.
Расскажите подробней, зачем вы меняете стек навигации во время пуша? Может быть, есть решение без использования `transitionCoordinator`.
Расскажите подробней, зачем вы меняете стек навигации во время пуша? Может быть, есть решение без использования `transitionCoordinator`.
во время пушаНе во время, а после пуша. Для этого и нужен
completion block
.зачем вы меняете стек навигацииДопустим у вас в стеке есть контролеры А, Б. Вам пришла пуш-нотификация и надо показать контролер В в этот же навигационный стек. Но есть бизнес логика, которая запрещает иметь живой контролер Б если в стеке есть контролер В. Соответственно, после пуша мы получаем массив А, Б, В. И я его без анимации подменяю на массив А, В после окончания пуша в стэк.
— Deleted
Писал с нуля такую всплывающую модалку целую неделю. В итоге плюнул и нашёл Под «SPStorkController» полностью повторяющий функционал модалки в стандартном приложении «Музыка», вплоть до анимации сгибания стрелки. Закончил 19 августа, спустя 3 дня выходит сия статья. Мб выйди она раньше не бросил и дописал свою реализацию до конца)
SPStorkController
крутой под. Как вижу, там реализовали целый стек из контроллеров.
Если правильно понимаю, то у Музыки немного другой подход, контроллер всегда на экране. Тогда лучше делать не через транзишены, а управлять UIViewPropertyAnimator
как в этой статье.
Спасибо большое за ваш труд! Вся информация полностью актуальна на 2022 год и iOS 16. В коде есть опечатка. presentationController =
лишнее здесь:
class PanelTransition: NSObject, UIViewControllerTransitioningDelegate {
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
return presentationController = PresentationController(presentedViewController: presented,
presenting: presenting ?? source)
}
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Всплывай! Транзишены в iOS