web-dev-qa-db-fra.com

Présentez un contrôleur de vue, ignorez-le et présentez-en un autre dans Swift

J'ai donc un contrôleur de vue racine qui a un bouton qui, lorsque l'utilisateur le pousse, un autre contrôleur de vue est présenté. Ce deuxième contrôleur a une option de rejet qui revient simplement au contrôleur de vue racine et un bouton qui, lorsque l'utilisateur le touche, rejette le contrôleur de vue actuel afin qu'il revienne au contrôleur de vue racine pendant une seconde et en présente un autre. Aller au premier contrôleur que j'utilise:

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

Et lorsque dans l'autre contrôleur de vue, je sélectionne le bouton qui ne fait que le rejeter, je le fais.

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

Donc, pour le deuxième contrôleur qui doit rejeter et présenter un autre, j'ai essayé ce qui suit:

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

Mais je reçois une erreur:

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

L'erreur se produit car vous essayez de présenter SecondController à partir de FirstController après avoir rejeté FirstController. Cela ne fonctionne pas:

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

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

Ce problème est très similaire à une question que j'ai répond hier.

Modifié pour votre scénario, je suggère ceci:

weak var pvc = self.presentingViewController

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