我刚刚遇到了一个我经过错误测试的应用程序的问题。我正在敲打墙头,明白为什么我会收到这个错误:
2013-11-25 09:02:55.687[186:60b] nested push animation can result in corrupted navigation bar
2013-11-25 09:02:56.055[186:60b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
2013-11-25 09:02:57.666[186:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't add self as subview'
过了一段时间,我创建了一个新项目来尝试重现该错误:
当我按下具有不同segue的两个条形按钮项目,然后同时释放时,会发生这种情况。我正在使用带有segues的故事板,并且没有任何自编代码。这是iOS7的错误,还是我错过了什么?
我无法在模拟器上重现,因为我没有两个游标......我正在使用带有iOS7 7.0.3的iPad2
故事板的形象:
编辑:
由于我被粉碎并完全没有投票,甚至没有人试图复制并确认这个错误,我已经在没有确认的情况下报告了它。
EDIT2:
Apple请求Stack跟踪。但由于我给了他们重现的确切步骤,我没有打扰。这不是我的工作。所以请随时报告。答案 0 :(得分:0)
这可能是因为你同时调用两个segues,当你释放按钮时,app会尝试在另一个segue完成之前调用一个segue。
所以我可以看到Xcode提示的警告是因为其中一个视图控制器是由segue触发的,另一个视图控制器的另一个segue是在没有等待第一个视图控制器的加载端的情况下触发的。
您可以尝试设置bool或某种控制器来检查第一个视图控制器何时加载,然后在您知道第一个视图控制器已正确加载时触发另一个segue。
答案 1 :(得分:0)
我通过执行以下操作在我的应用中遇到了同样的问题: 1次登录(使用动画执行segue) 2快速在新屏幕上进行选择(启动另一个segue)
如果你尝试在上一个过渡动画完成之前执行一个segue,它可以搞砸了。所以我在执行segue之前添加了一个延迟,它似乎解决了它。 但是,我不认为这是最终解决方案,因为segue动画持续时间可能因设备的速度而有所不同。
我认为最好的解决方案是触发segue AFTER viewDidAppear。
答案 2 :(得分:0)
我刚刚实现了类似的东西,现在正在运作。
所以我有视图控制器A,B& C.通常用户可以从A导航到B,从B导航到C,但现在我创建了一种用户可以自动从A导航到C(到B)的方式。
我所做的是在B中创建一个公共方法,用来推动C.这个方法看起来像:
- (void)pushC {
if ([self isViewLoaded] && self.navigationController.visibleViewController == self && ![self isBeingPresented] && self.didViewAppear) {
[self performSegueWithIdentifier:@"CSegue" sender:self];
}
else {
[self performSelector:@selector(pushC) withObject:nil afterDelay:0.4f];
}
}
除了didViewAppear
财产之外,一切都已经给你了。那个我在- viewDidAppear
上设置为真。
然后我只需要在视图控制器A中的- pushC
方法上调用- prepareForSegue
。正如我们所见,他将等待正确的时间来实际调用下一个segue。
这项工作正常,但显示了我不需要的所有导航过渡。我宁愿能够将一棵树推入导航控制器,所以我只有一个过渡导航。好吧,我想我以后必须回到这件事。
据说我不认为这是一个错误,但实际上是iOS7中的行为改变,因为动画变得更长。