web-dev-qa-db-fra.com

ignorer le contrôleur de vue actuel APRÈS avoir présenté le nouveau contrôleur de vue - swift

J'essaie de rejeter un VC et de présenter un nouveau VC. mais je ne veux plus que l'ancien VC existe. J'utilise le code ci-dessous pour ignorer l'actuel VC et en présenter un nouveau. mais de cette façon, il y a un intervalle de temps entre le rejet et le présent. Je ne veux pas que l'utilisateur le remarque. donc, je veux d'abord présenter le nouveau VC puis rejeter le précédent. Est-ce qu'il y a un moyen de faire ça?

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let destinationController = self.storyboard?.instantiateViewController(withIdentifier: "login") as! Login
let presentingVC = self.presentingViewController
self.dismiss(animated: false, completion: { () -> Void   in
    presentingVC!.present(destinationController, animated: true, completion: nil)
})
11
Hos Ap

Je pense que la meilleure façon sera de rejeter le courant VC lorsque vous reviendrez. Cela signifie que présentez votre destinationController en utilisant le courant VC = puis lorsque vous revenez en arrière, rejetez les deux VC

5
JohnnyAW

Avertissement

Donc, à moins que vous n'ayez absolument besoin de présenter de façon modale votre nouveau VC, je vous recommande de simplement effectuer une transition entre les deux VC. Il semble que vous ne le présentiez que de manière modale car vous souhaitez le supprimer manuellement plus tard du VC d'origine. Non seulement l'utilisation d'un enchaînement est plus facile à mon avis, mais cela vous permettra également d'utiliser la méthode que j'ai décrite ci-dessous.

Solution

Ce n'est probablement pas la méthode la plus élégante, mais vous pouvez passer l'instance de l'ancien VC via prepareForSegue au VC suivant, puis la supprimer dans le nouveau VC viewDidLoad.

Par exemple, dans votre nouveau VC vous pourriez avoir quelque chose comme ceci:

class NewVC: UIViewController {

    ...
    var prevVC: PrevVC!

    override func viewDidLoad() {
        super.viewDidLoad()

        prevVC.dismiss(animated: false, completion: nil)
    }

}

Ainsi, lorsque votre nouveau VC se charge, il rejette le VC précédent. Tout ce que vous auriez besoin de faire dans votre classe prevVC est de passer l'instance dans prepareForSegue comme ça.

class PrevVC: UIViewController {
    ...
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destinationVC = segue.destination as? NewVC {

            destinationVC.prevVC = self

        }
    }

}

Bien sûr, il vous suffirait de présenter le nouveau VC quand vous le souhaitez et ensuite tout le reste serait pris en charge.

10
Benjamin Lowry