推动视图控制器两次
在我的应用程序中,我遇到以下错误的问题:
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() } } }