iOS5:在模态 UIViewController 中播放 Youtube 视频时 UIWebView 出现异常

Posted

技术标签:

【中文标题】iOS5:在模态 UIViewController 中播放 Youtube 视频时 UIWebView 出现异常【英文标题】:iOS5: Exception on UIWebView in modal UIViewController playing Youtube video 【发布时间】: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 【参考方案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];

【讨论】:

以上是关于iOS5:在模态 UIViewController 中播放 Youtube 视频时 UIWebView 出现异常的主要内容,如果未能解决你的问题,请参考以下文章

iOS5中UIViewController的新方法

在 iOS5 中未调用 UIViewController 设备旋转委托方法

如何在 ios5 的 UIViewController 中显示 UIView?

在 iOS 5 中释放 UIviewController 对象?

如何从模态视图推送 UIViewController

iPhone IOS5 Storyboard,如何加载带有自定义 .xib 文件的 UIViewController?