【问题标题】:Nested push animations iOS7 bug?嵌套推送动画 iOS7 错误?
【发布时间】:2013-11-25 08:12:10
【问题描述】:

我刚刚在经过错误测试的应用程序中遇到了问题。我拼命想明白为什么会出现这个错误:

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

故事板图片:

编辑:

由于我在没有人尝试重现和确认此错误的情况下被粉碎并完全投反对票,因此我在没有确认的情况下报告了它。

编辑2:

Apple 要求堆栈跟踪。但由于我给了他们复制的确切步骤,我没有打扰。这不是我的工作。因此,请随时报告。

【问题讨论】:

  • 如果您尝试单击任何按钮,它将如何生成错误
  • 我同时按下了两个条形按钮项目,并按住它们。并同时发布。
  • 这不是一个编程问题,如果您认为这是一个错误,那么它应该真正出现在 Apple 主板上或雷达上。
  • 如果发错地方,我很抱歉。我不确定这是否是一个错误,但它确实看起来像它。我把它放在这里是为了获得一些反馈,也许看看其他人是否可以复制它。
  • 临时解决办法是禁用按下手势时的另一个按钮。

标签: ios objective-c ios7 uistoryboardsegue


【解决方案1】:

这可能是因为您同时调用了两个 segue,当您释放按钮时,应用程序试图在另一个 segue 完成之前调用一个 segue。

所以我可以看到 Xcode 显示的警告是因为您的一个视图控制器是由 segue 触发的,而另一个视图控制器的另一个 segue 是在不等待第一个视图控制器的加载结束的情况下触发的。

您可以尝试设置 bool 或某种控制器来检查第一个视图控制器何时加载,然后在您知道第一个视图控制器已正确加载时触发您的另一个 segue。

【讨论】:

  • 是的,我现在使用自己的布尔标志手动执行转场,以检查它是否安全。 Apple 出现错误的 segue 代码。为什么他们鼓励我们在有 bug 的时候使用故事板 segues?
  • 我在使用 Apple 开发工具编程时遇到的大多数问题和错误 99.9% 都是我自己的错,所以我无法真正评论 Xcode 错误。 .
  • 这正是我在此处发布此内容的原因,以查看其他人是否可以在发布有关苹果的错误报告之前复制。
  • 我刚刚找到了这个帖子。有同样的问题。我的顺序是横幅 > 主要(容器嵌入)> 细节(推送)到笔记(推送)。我还得到“嵌套推送动画可能导致导航栏损坏”以及“在意外状态下完成导航转换。导航栏子视图树可能会损坏”(确实如此)。我可以通过使用 xib 来完成这项工作,但我不希望这样做。有什么解决方法吗?
【解决方案2】:

通过执行以下操作,我在我的应用程序中遇到了同样的问题: 1次登录(用动画执行segue) 2 在新屏幕上快速做出选择(启动另一个 segue)

如果您尝试在上一个过渡动画完成之前执行转场,它可能会搞砸。所以我在执行 segue 之前添加了一个延迟,它似乎修复了它。 但是,我认为这不是最终解决方案,因为 segue 动画持续时间可能会因设备的速度而异。

我认为最好的解决方案是在 viewDidAppear 之后触发 segue。

【讨论】:

    【解决方案3】:

    我刚刚实现了类似的东西,现在它正在工作。

    所以我有视图控制器 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 上设置为true。

    然后我只需要在视图控制器 A 中的 - prepareForSegue 方法上调用 - pushC。正如我们所看到的,他将等待合适的时间来真正调用下一个 segue。

    这没问题,但显示了所有我不需要的导航转换。我希望能够将一棵树推入导航控制器,这样我就只有一个过渡导航。好吧,我想我得稍后再讨论这件事。

    话虽如此,我不认为这是一个错误,但实际上是 iOS7 中的行为变化,因为动画变长了。

    【讨论】:

      猜你喜欢
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      相关资源
      最近更新 更多