2

我在 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”

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

4

3 回答 3

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 节中讨论。

于 2012-04-02T19:51:47.640 回答
0

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

于 2012-05-19T00:15:51.937 回答
0

当 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.
    }
}

我希望这可以帮助别人。

于 2013-10-24T09:07:04.453 回答