嵌套推送动画iOS7的bug?

时间:2013-11-25 08:12:10

标签: ios objective-c ios7 uistoryboardsegue

我刚刚遇到了一个我经过错误测试的应用程序的问题。我正在敲打墙头,明白为什么我会收到这个错误:

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

故事板的形象:

enter image description here

编辑:

由于我被粉碎并完全没有投票,甚至没有人试图复制并确认这个错误,我已经在没有确认的情况下报告了它。

EDIT2:

Apple请求Stack跟踪。但由于我给了他们重现的确切步骤,我没有打扰。这不是我的工作。所以请随时报告。

3 个答案:

答案 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中的行为改变,因为动画变得更长。