【问题标题】:Youtube video inside modal ViewController, strange crash 'UIViewControllerHierarchyInconsistency'模态 ViewController 内的 Youtube 视频,奇怪的崩溃“UIViewControllerHierarchyInconsistency”
【发布时间】:2012-03-07 11:42:23
【问题描述】:

我在 iPad 5.0 上遇到了奇怪的崩溃问题。 此崩溃仅发生在 iOS 5.0 和带有模态 ViewController 且 ViewControler 样式设置为除全屏之外的任何内容的 iPad 上,这可以正常工作。

我包含了一个代码示例。如果您运行它并按下 Pagesheet 按钮,则会出现一个带有 UIWebView 和 Youtube 视频的窗口。视频开始后,按“全屏”触发错误。 (仅限 iOS 5,它可以在 iOS 4.x 中运行)。

如果您按下全屏按钮,唯一的区别是我为模态 UIViewController 使用全屏样式,并且视频播放正常。

有人知道变通方法或更好的解决方案吗?

由于未捕获的异常“UIViewControllerHierarchyInconsistency”原因终止应用程序:“子视图控制器:“UIViewController:0x85d5e00”应该有父视图控制器:“NewsTableViewController:0x855f7b0”但请求的父视图是:“MPInlineVideoViewController:0x85d3a20” em>

源代码(Dropbox)http://db.tt/xqMbeYP1

【问题讨论】:

  • 我不知道为什么会发生这种情况,但您可以通过动画自定义视图而不是推送模态控制器来解决它。
  • tipycalFlow 是对的。这是UIWebView 中的一个错误,所以我们现在必须解决它。愚蠢的苹果没有修复UIWebView

标签: ios uiviewcontroller uiwebview nsexception


【解决方案1】:

这不是部分 UIWebView 的错误。

发生的事情是,Apple 最终对维护应用程序视图层次结构的方式变得更加严格。在 iOS 5.x 之前,开发人员能够从一个层次结构中删除视图并将其添加到另一个层次结构中。一个完美的例子就是应用程序的主视图层次结构;当呈现一个模态视图控制器时,这个模态视图控制器有它自己的视图层次结构,它不是应用程序视图层次结构的一部分;因此,如果模态视图控制器有一个子视图,并且在该视图中它说一个电影(恰好也是一个视图)并且该电影将被最大化,则该电影的视图将从模态视图控制器的层次结构中删除,并且添加到应用程序的视图层次结构...

application                                              modal view controller
   |                                                              |
   |                                                              |
window                                                          view
   |                                                              |
   |                                                              |
   |----------------                                   ------------------
   |               |                                   |                |
   |               |                                   |                |
subview 1     subview 2                             subview 3         movie

可以看出,模态视图控制器的视图层次结构位于应用程序的视图层次结构之外,这在 iOS 5.x 之前不是问题,因为当呈现模态视图控制器并最大化影片时,Apple做了以下事情:

application                                              modal view controller
   |                                                              |
   |                                                              |
window                                                          view
   |                                                              |
   |                                                              |
   |-------------------------                          ------------
   |          |             |                          |
   |          |             |                          |
  movie    subview 1     subview 2                  subview 3

电影出现在所有其他视图之上。在 iOS 5.x+ 中不再是这种情况,这样做是错误的,您将看到之前遇到的错误。

为了解决这个问题,您需要通过不将视图控制器呈现为模态视图控制器,然后将视图控制器的视图添加到应用程序的层次结构中,从而使模态视图控制器的视图进入应用程序的视图层次结构如下:

                                                          application
                                                               |
                                                               |
modal view controller                                        window
          |                                                    |
          |                                                    |
          ---------------------------------------------------------------
          |                                       |                     |
          |                                       |                     |
         view                                  subview 1            subview 2
          |
          |
    -------------------
    |                 |
    |                 |
 subview 3          movie

从现在开始,每个人都需要从一开始就真正思考如何正确构建视图层次结构以及它们如何相互交互,以及这些大型项目中未来的可扩展性。

Apple 在 2011 年 WWDC 期间详细记录了此问题。它在 Session 102 中讨论。

【讨论】:

  • 等一下……这不是苹果的错吗? UIWebview 是他们的代码,就像呈现模态视图一样,Safari 也是如此。嵌入式视频遍布整个网络,有 1/2 百万个应用程序使用他们的 SDK,他们决定让它不向后兼容?我会说这是Apple的一个错误。同意,新的视图层次结构打破了人们正在做的许多黑客行为 - 但这不是黑客行为。
  • 这是一个很好的答案,它解释了它发生的原因和解决方案。但声称这不是 Apple 的错误可能是错误的,因为他们在 iOS 6+ 中修复了这个问题。它在那里是如何工作的?
【解决方案2】:

我遇到了同样的问题。问题是模态没有添加为呈现它的视图控制器的子项。似乎是一个 UIKit 错误。我们的解决方法是制作一个看起来相同的人造模态。花了几个小时但成功了。

【讨论】:

    【解决方案3】:

    当 youtube 进入全屏模式时,我遇到了应用崩溃的问题。

    事实证明,进入全屏模式会在 UIWebView 的视图控制器上调用“viewWillDisappear”,其中我有一些代码来停止播放器,从超级视图中清除一些视图等。

    我已经通过将“viewWillDisappear”代码(关闭 youtube)移动到“didMoveToParentViewController”来解决它

    - (void)didMoveToParentViewController:(UIViewController *)parent {
        // parent is nil if this view controller was removed
        if (parent == nil) {
            [self closeModal];    // this is moved from viewWillDisappear - it is only called when "Back" button of navigationcontroller's item is clicked.
        }
    }
    

    我希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 2013-11-16
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      相关资源
      最近更新 更多