Представьте контроллер представления, отклоните его и представьте другой в Swift

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

let vc = FirstController()
self.present(vc, animated: true, completion: nil)

И когда в другом контроллере представления я выбираю кнопку, которая только отклоняет, я делаю это.

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

Итак, для второго контроллера, который должен отклонить и представить другого, я попробовал следующее:

self.dismiss(animated: true, completion: {
            let vc = SecondController()
            self.present(vc, animated: true, completion: nil)
        })

Но я получаю сообщение об ошибке:

Warning: Attempt to present <UINavigationController: 0xa40c790> on <IIViewDeckController: 0xa843000> whose view is not in the window hierarchy!

Ответ 1

Ошибка возникает из-за того, что вы пытаетесь представить SecondController из FirstController после того, как вы упустили FirstController. Это не работает:

self.dismiss(animated: true, completion: {
    let vc = SecondController()

    // 'self' refers to FirstController, but you have just dismissed
    //  FirstController! It no longer in the view hierarchy!
    self.present(vc, animated: true, completion: nil)
})

Эта проблема очень похожа на вопрос, который я ответил вчера.

Модифицированный для вашего сценария, я бы предложил следующее:

weak var pvc = self.presentingViewController

self.dismiss(animated: true, completion: {
    let vc = SecondController()
    pvc?.present(vc, animated: true, completion: nil)
})