【问题标题】:iOS5: Exception on UIWebView in modal UIViewController playing Youtube videoiOS5:在模态 UIViewController 中播放 Youtube 视频时 UIWebView 出现异常
【发布时间】:2011-12-15 20:33:44
【问题描述】:

更新:iOS 6 beta 1 上不再出现

我目前正在使用新的 iOS 5 SDK 调整现有的 iOS 4 应用程序。 在读取 Youtube 视频的模态视图控制器中显示 UIWebView 时,我发现了一个新的崩溃。

开始阅读视频很好,但是当我尝试将其设置为全屏时,出现以下异常:

Exception: UIViewControllerHierarchyInconsistency,
child view controller:<UIViewController: 0x6aef180> 
should have parent view controller:<WebViewController: 0x6a706c0> 
but requested parent is:<MPInlineVideoViewController: 0x6ae5d40>

这是我在主视图控制器中实例化和呈现模态视图控制器的方式:

- (IBAction)buttonReleased:(id)sender
{
    WebViewController *webVC = [[WebViewController alloc] initWithNibName:@"WebViewController" bundle:[NSBundle mainBundle]];
    webVC.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    webVC.modalPresentationStyle = UIModalPresentationPageSheet;
    [self presentModalViewController:webVC animated:YES];
}

我使用 UIModalPresentationPageSheet 作为 modalPresentationStyle,当我将此值设置为 UIModalPresentationFullScreen 时,不再出现错误。

在我的模态 WebViewController 中,这是我加载 Youtube 视频的方式:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.youtube.com/watch?v=bDlm3eLRut0"]]];
}

对这个问题有什么想法吗? 如果需要,我可以提供一个完整的示例代码来隔离此崩溃。

谢谢!

【问题讨论】:

  • 我在加载 CocosDeshion 音频引擎时遇到了类似的错误。这些消息非常烦人,因为它们使控制台变得混乱。任何帮助将不胜感激。
  • 可能只是在这里采摘稻草,但您谈论“全屏”呈现它,然后说您正在使用 UIModalPresentationPageSheet。如果你想做全屏显示,你不想使用 UIModalPresentationFullScreen 吗?
  • 关于找到解决此问题的任何更新?
  • 这是苹果需要修复的错误。请欺骗我的雷达。 openradar.appspot.com/radar?id=1721401

标签: ios uiwebview ios5 html5-video modalviewcontroller


【解决方案1】:

这些控制台警告是由于加载了 Mac 上的音频组件。它是模拟器而不是模拟器——模拟器仍然是 Mac OS X 应用程序,因此在使用音频时,它会加载 Mac 应用程序加载的所有音频 kext。当我在模拟器中为我的 Bandcamp 应用程序 Kumbaya 测试音频流时,就会发生这种情况。如果您不想看到这些问题,请在设备上进行测试。

如果你愿意,你可以用以下方式包装你的音频方法:

#if ! TARGET_IPHONE_SIMULATOR
#endif

在模拟器中禁用它们。

【讨论】:

  • 好的,我从原始问题中删除了这些警告,因为它们与真正的问题无关:当我将视频设置为全屏模式时引发的异常。
【解决方案2】:

我们通过实现我们自己的模态视图转换解决了这个问题。这实际上很容易做到。我在大约 4 小时内完成了它。

如果您以模态方式全屏显示,也可以避免崩溃。表单(表单或页面表单)是导致崩溃的原因。

【讨论】:

    【解决方案3】:

    我的申请中遇到了同样的问题。原来我在UIWindow中设置了错误的rootViewController

    我的 NIB 中有以下视图控制器层次结构:

    Navigation Controller
    +- Main View Controller
    

    UIWindowrootViewController 出口设置为Main View Controller,而不是Navigation Controller。一旦我将插座更改为Navigation ControllerUIViewControllerHierarchyInconsistency 异常就不再发生。

    【讨论】:

    • 感谢您的回答,我会检查并回来告诉您是否可以解决问题。
    • 在这方面仍然没有解决方案......在查看 WWDC 2011 主题演讲 102 解释如何发生此异常后,我真的开始认为这是一种不良行为,当 UIWebView 实例化 MPInlineVideoViewController 并添加它视图到视图层次结构。我提交了错误报告 #10353853,其中包含一个重现此问题的简单项目。此时仍然没有答案...
    【解决方案4】:

    我们在 iPad 上的 pageSheet 模态控制器中播放视频时遇到了同样的问题。

    它只发生在我们身上

    • IOS 5 (5.0 + 5.1)
    • iPad 处于横向模式
    • 呈现 Webview 控制器 在 PageSheet / FormSheet 模式下以模态方式加载视频资源

    我们已通过在 IOS 5 中强制控制器处于全屏模式来解决此问题。 现在工作正常。

    //Fix for IOS 5.0 issues with playing video in pageSheet
    float version = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (version >= 6.0)
    {
        [controllerToDisplayModally setModalPresentationStyle:UIModalPresentationPageSheet];
    }
    else
    {
        [controllerToDisplayModally setModalPresentationStyle:UIModalPresentationFullScreen];
    }
    
    [controllerToDisplayModally setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
    
    [self presentViewController:controllerToDisplayModally animated:YES completion:nil];
    

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 2011-05-05
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2013-03-21
      相关资源
      最近更新 更多