虽然正在进行现有的过渡或演示; 导航堆栈不会更新

我遇到过这个警告:

pushViewController:animated:在发生现有转换或演示时调用; 导航堆栈不会更新。

在尝试从UIAlertController完成块调用navigationController?.popViewControllerAnimated(false)

此警告表示您正在尝试错误地使用UINavigationController

pushViewController:animated:在发生现有转换或演示时调用; 导航堆栈不会更新

您在评论中提到您正在尝试使用ViewController

 navigationController?.popViewControllerAnimated(false) 

UIAlertController内部完成块。 因此,您正试图从错误的视图中展开, UIAlertController不是UINavigationController堆栈的一部分

首先尝试关闭UIAlertController ,然后弹出当前的ViewController 。 换句话说,从completion块中删除pop并将其放在OK块中。 或者在警报前使用unwind segue。

另一种可能性是,你在storyboard有一个未使用或相同的副本。 因此,如果由storyboard按钮触发unwinding操作,请选择此按钮并检查connectivity inspector并删除不需要的连接。

例如:在我的情况下,标记的红色x是不必要的。 例

我使用DispatchQueue.main.async解决了这个问题。在UIAlertController的Transition完成后调用popviewcontroller

1)显示警报

2)延迟后调用pop viewcontroller

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

这不是最好的方法,但它有效!

我正在使用dispatch_async 及其工作 。 我试图导航回来但没有奏效, 因为导航堆栈不会更新。

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

我的解决方案是调用dismissViewControllerAnimated:首先然后从导航堆栈中弹出viewcontroller这对我有用: –

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