推动视图控制器两次

时间:2016-06-15 08:14:32

标签: ios swift uiviewcontroller uinavigationcontroller

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

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上的大多数答案,因此对于如何调查而言有点不知所措。

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

let object = { "selectedPriority": "9", "selectedShipOption": "Private Label", "selectedCustomerStatus": "No", "selectedColdOptions": [], "selectedDistributionOptions": ["Retail"], "selectedPackagingOption": "Lid", "selectedPrepOption": "Hot Water", "productParams": ["Kosher\n"], "productAppearance": "Grill Marks", "storage": "CAP", "preservatives": "Only natural preservatives" } Object.keys(object).map((key, index) => { console.log(`?${key}=${object[key]}`) });的救援完成块:)

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

我们使用布尔变量push来确保在已经推入新视图控制器的同时不会将其推入。

isPushing

答案 3 :(得分:0)

在执行推送的函数中:

guard navigationController?.topViewController == self else { return }