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.
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.
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!
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)
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)!
})
})
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