推动视图控制器两次

在我的应用程序中,我遇到以下错误的问题:

Pushing the same view controller instance more than once is not supported 

这是一个来自少数用户的错误报告。 我们试图复制它但不能(双击按钮等)。 这是我们用来打开视图控制器的行:

 let storyboard = UIStoryboard(name: "Main", bundle: nil) let editView = storyboard.instantiateViewControllerWithIdentifier("EditViewController") as! EditViewController editView.passedImage = image editView.navigationController?.setNavigationBarHidden(false, animated: false) if !(self.navigationController!.topViewController! is EditViewController) { self.navigationController?.pushViewController(editView, animated: true) } 

有人有什么想法吗? 我已经完成了一些研究,并且我们已经涵盖了Stack上的大多数答案,因此对于如何调查而言有点不知所措。

试试这个以避免两次推送同一个VC:

 if !(self.navigationController!.viewControllers.contains(editView)){ self.navigationController?.pushViewController(editView, animated:true) } 

由于pushViewController从iOS7开始是异步的,如果点击推动视图控制器太快的按钮,它将被推送两次。 我遇到过这样的问题,我尝试的唯一方法是在调用push时设置一个标志(即- navigationController:willShowViewController:animated:并在调用UINavigationController的委托时取消设置标志- navigationController:didShowViewController:animated:

这很难看,但它可以避免两次推送的问题。

CATransaction的救援完成块:)

pushViewController(:animated:)实际上被推送到CATransaction堆栈,该堆栈由run loop每次迭代创建。 因此,一旦push动画完成,就会调用CATransaction的完成块。

我们使用一个布尔变量isPushing来确保在推送一个新的视图控制器时无法按下它。

 class MyNavigationController: UINavigationController { var isPushing = false override func pushViewController(_ viewController: UIViewController, animated: Bool) { if !isPushing { isPushing = true CATransaction.begin() CATransaction.setCompletionBlock { self.isPushing = false } super.pushViewController(viewController, animated: animated) CATransaction.commit() } } }