现有的过渡或演示正在发生;导航堆栈不会更新

时间:2016-05-17 07:45:49

标签: ios swift

我遇到了这个警告:

  

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

尝试从navigationController?.popViewControllerAnimated(false)完成时段调用UIAlertController

6 个答案:

答案 0 :(得分:19)

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

  

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

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

navigationController?.popViewControllerAnimated(false)

UIAlertController的完成块内。因此,您尝试从错误的视图中展开, UIAlertController不属于UINavigationController堆栈

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

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

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

答案 1 :(得分:12)

我使用 DispatchQueue.main.asyncAfter 在UIAlertController的转换完成后调用popviewcontroller解决了这个问题

1)显示提醒

2)延迟后调用pop viewcontroller

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

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

答案 2 :(得分:1)

我正在使用 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)!
        })
    })

答案 3 :(得分:1)

在“确定”操作按钮处理程序上添加导航控制器的代码。点击确定按钮时,导航视图控制器

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)

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

任何人都需要回到 PreviousVC 使用此代码。 Swift5

    dismiss(animated: true) {
        // If you need call someFunction()
        self.someFunction()
        self.navigationController?.popViewController(animated: true)
    }