在我的应用中,我遇到以下错误的问题:
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上的大多数答案,因此对于如何调查而言有点不知所措。
答案 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 }