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
UIWindow
的rootViewController
出口设置为Main View Controller
,而不是Navigation Controller
。一旦我将插座更改为Navigation Controller
,UIViewControllerHierarchyInconsistency
异常就不再发生。
【讨论】:
感谢您的回答,我会检查并回来告诉您是否可以解决问题。 在这方面仍然没有解决方案......在查看 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 中显示 UIView?