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

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

在模拟器中禁用它们。


我的申请中遇到了同样的问题。原来我在 UIWindow.

中设置了错误的 rootViewController

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

1
2
Navigation Controller
+- Main View Controller

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


我们在 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];