Pull to refresh

Comments 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`.
во время пуша
Не во время, а после пуша. Для этого и нужен completion block.

зачем вы меняете стек навигации
Допустим у вас в стеке есть контролеры А, Б. Вам пришла пуш-нотификация и надо показать контролер В в этот же навигационный стек. Но есть бизнес логика, которая запрещает иметь живой контролер Б если в стеке есть контролер В. Соответственно, после пуша мы получаем массив А, Б, В. И я его без анимации подменяю на массив А, В после окончания пуша в стэк.
Может быть, можно без анимации скрыть контроллер Б и без анимации пушнуть контроллер В?
Писал с нуля такую всплывающую модалку целую неделю. В итоге плюнул и нашёл Под «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)
}
Sign up to leave a comment.