iOS5: Exception on UIWebView in modal UIViewController playing Youtube video
更新:iOS 6 beta 1 上不再出现
我目前正在使用新的 iOS 5 SDK 调整现有的 iOS 4 应用程序。
在读取 Youtube 视频的模态视图控制器中显示 UIWebView 时,我发现了一个新的崩溃。
开始阅读视频很好,但是当我尝试将其设置为全屏时,出现以下异常:
1 2 3 4 | Exception: UIViewControllerHierarchyInconsistency, child view controller:<UIViewController: 0x6aef180> should have parent view controller:<WebViewController: 0x6a706c0> but requested parent is:<MPInlineVideoViewController: 0x6ae5d40> |
这是我在主视图控制器中实例化和呈现模态视图控制器的方式:
1 2 3 4 5 6 7 | - (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 视频的方式:
1 2 3 4 5 6 | - (void)viewDidLoad { [super viewDidLoad]; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.youtube.com/watch?v=bDlm3eLRut0"]]]; } |
对这个问题有什么想法吗?
如果需要,我可以提供一个完整的示例代码来隔离此崩溃。
谢谢!
我们通过实现我们自己的模态视图转换来解决这个问题。这实际上很容易做到。我在大约 4 小时内完成了它。
如果您以模态方式全屏显示,也可以避免崩溃。表单(表单或页面表单)是导致崩溃的原因。
这些控制台警告是由于加载了 Mac 上的音频组件。它是模拟器而不是模拟器——模拟器仍然是 Mac OS X 应用程序,因此在使用音频时,它会加载 Mac 应用程序加载的所有音频 kext。当我在模拟器中为我的 Bandcamp 应用程序 Kumbaya 测试音频流时,就会发生这种情况。如果您不想看到这些问题,请在设备上进行测试。
如果你愿意,你可以用:
package你的音频方法
1 2 | #if ! TARGET_IPHONE_SIMULATOR #endif |
在模拟器中禁用它们。
我的申请中遇到了同样的问题。原来我在
中设置了错误的
我的 NIB 中有以下视图控制器层次结构:
1 2 | Navigation Controller +- Main View Controller |
我们在 iPad 上的 pageSheet 模态控制器中播放视频时遇到了同样的问题。
它只发生在我们身上
- IOS 5 (5.0 5.1)
- 横向模式下的 iPad
-
呈现 Webview 控制器
模态并以 PageSheet / FormSheet 模式加载视频资源
我们已通过在 IOS 5 中强制控制器处于全屏模式来解决此问题。
现在工作正常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //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]; |