web-dev-qa-db-fra.com

Pendant qu'une transition ou une présentation existante est en cours; la pile de navigation ne sera pas mise à jour

J'ai rencontré cet avertissement:

pushViewController: animé: appelé lorsqu'une transition ou une présentation existante est se produisant; la pile de navigation ne sera pas mise à jour.

En essayant d’appeler navigationController?.popViewControllerAnimated(false) à partir du UIAlertController complétion block.

15
Siddu Halake

Cet avertissement indique que vous essayez d'utiliser UINavigationController à tort:

pushViewController: animated: appelé lorsqu'une transition ou une présentation existante est en cours; la pile de navigation ne sera pas mise à jour

Vous avez mentionné dans les commentaires que vous essayez de pop la ViewController en utilisant 

navigationController?.popViewControllerAnimated(false)

à l'intérieur du bloc d'achèvement de UIAlertController. Par conséquent, vous essayez de vous libérer de la mauvaise vue. UIAlertController NE FAIT PAS PARTIE DE LA PILE UINavigationController.

Essayez de fermer la UIAlertController en premier, puis décompressez la ViewController actuelle. En d'autres termes, supprimez la variable pop du bloc completion et placez-la à l'intérieur du bloc OK. ou utilisez unwind segue avant l'alerte.

Une autre possibilité est que vous ayez un doublon inutilisé ou identique dans storyboard. Par conséquent, si l'opération unwinding est déclenchée par le bouton storyboard, sélectionnez ce bouton, vérifiez le connectivity inspector et supprimez les connexions non souhaitées. 

Par exemple: le x rouge marqué était inutile dans mon cas .  Example

18
Idan

J'ai résolu ce problème en utilisant DispatchQueue.main.asyncAfter call popviewcontroller après la fin de la transition de UIAlertController. 

1) Afficher l'alerte

2) Appelez pop viewcontroller après le délai

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    self.navigationController?.popToRootViewController(animated: true)
}

Ce n'est pas la meilleure façon, mais ça marche!

8
Meghs Dhameliya

Ajoutez le code du contrôleur de navigation sur le gestionnaire de bouton d’action ok. Lorsque vous appuyez sur le bouton ok, parcourez le contrôleur de vue. 

let okActionBtn = UIAlertAction(title: "Ok", style: .default, handler: {
      self.navigationController?.popViewController(animated: true)
})
let cancelActionBtn = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
alert.addAction(okActionBtn)
alert.addAction(cancelActionBtn)
self.present(alert, animated: true)

1
Sourabh Kumbhar

j'utilise dispatch_async et son fonctionnement . J'ai essayé de revenir en arrière mais je n'ai pas travaillé car la pile de navigation ne sera pas mise à jour.

let destVC = self.storyboard?.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController
    self.presentViewController(destVC, animated: true, completion: {() -> Void in
        dispatch_async(dispatch_get_main_queue(), {() -> Void in
            self.navigationController?.popViewControllerAnimated(true)!
        })
    })
1
Mr.Javed Multani

Ma solution serait d’appeler licencierViewControllerAnimated: d’abord, puis ouvrez le contrôleur de vue de la pile de navigation, cela fonctionne pour moi:

[self dismissViewControllerAnimated:false completion:nil];
[myNavigationControllerInstance popToRootViewControllerAnimated:true]; // myNavigationControllerInstance = Your Navigation Controller Instance
0
dreamBegin