模态ViewController中的Youtube视频,奇怪的崩溃'UIViewControllerHierarchyInconsistency'

时间:2012-03-07 11:42:23

标签: ios uiviewcontroller uiwebview nsexception

我在iPad 5.0上遇到了一个奇怪的崩溃问题。 这种崩溃只发生在iOS 5.0和带有模态ViewController的iPad上,并且ViewControler样式设置为除了全屏之外的任何东西,效果很好。

我包含了一个代码示例。如果您运行它并按下Pagesheet按钮,将出现一个带有UIWebView和Youtube视频的窗口。视频开始后,按“全屏”触发bugg。 (仅适用于iOS 5,它适用于iOS 4.x)。

如果按全屏按钮,唯一的区别是我使用模式UIViewController的全屏风格,视频播放就好了。

有没有人知道解决方案或更好的解决方案?

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

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

3 个答案:

答案 0 :(得分:9)

这不是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期间得到了很好的记录。会议102中对此进行了讨论。

答案 1 :(得分:0)

我遇到了同样的问题。问题是模态不是作为呈现它的视图控制器的子项添加的。似乎是一个UIKit错误。我们的解决方法是制作一个看起来相同的仿形式。花了几个小时但是做了伎俩。

答案 2 :(得分:0)

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

事实证明,进入全屏模式会在UIWebView的viewcontroller上调用“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.
    }
}

我希望这有助于某人。