在UIWebView中播放YouTube视频。如何处理“完成”按钮?

10

我有一个UIWebView用于播放YouTube视频。如何处理"完成"按钮的操作? 目前,当我点击该按钮时,它会切换回我的应用程序主菜单(而不是应该关闭的菜单),并且只会冻结。 请问有谁能帮助我吗?

附:包含UIWebView的菜单之前是以模态方式呈现的。


你已经找到了解决方案,能否与我们分享一下? - Illep
还没有找到。 - jonypz
4个回答

8
YouTube插件播放器本身是一个模态视图控制器。当按下完成按钮时,它会返回到其“presentingViewController”。它的“presentingViewController”不是您的模态视图控制器,而是调用“[presentModalViewController:animated:]”来呈现您的模态视图控制器的视图控制器。由于原始模态视图控制器仍然处于活动状态,应用程序的行为变得不稳定。
为了解决这个问题,
1)跟踪模态视图控制器是否已经被呈现但未被解除。
2)在呈现视图控制器的“viewDidAppear”方法中,如果模态视图控制器已经被呈现但未被解除,则解除并重新呈现它。
例如,在呈现模态Web视图控制器的控制器中:
 - (void) presentModalWebViewController:(BOOL) animated {
      // Create webViewController here.
      [self presentModalViewController:webViewController animated:animated];
      self.modalWebViewPresented = YES;
  }

  - (void) dismissModalWebViewController:(BOOL) animated {
      self.modalWebViewPresented = NO;
      [self dismissModalViewControllerAnimated:animated];
  }

  - (void) viewDidAppear:(BOOL)animated {
      [super viewDidAppear:animated];
      if (self.modalWebViewPresented) {
           // Note: iOS thinks the previous modal view controller is displayed.
           // It must be dismissed first before a new one can be displayed.  
           // No animation is needed as the YouTube plugin already provides some.
           [self dismissModalWebViewController:NO];
           [self presentModalWebViewController:NO];
      }
  }

1
这种方法仅在VIEWDIDAPPEAR中解除webviewController时有效,在我的情况下,如果我在VIEWWILLAPPEAR中这样做,它会崩溃。请注意。感谢提示。 - Vassily
这很好用,谢谢。有人知道为什么我们首先要这样做吗?这是UIKit中的一个错误吗,还是我对模态视图控制器有什么误解? - Defragged
2
在这种情况下,UIWebView以模态方式呈现,并且放置在其上的You Tube插件也以模态方式呈现。因此,我们有一个模态视图控制器呈现一个模态视图控制器。UIKit希望只有一个模态视图控制器被呈现,并且当顶部视图控制器被解除显示时,位于其下面的视图控制器也会被解除显示。当发生这种情况时,基础视图控制器将调用viewDidAppear:并给我们重新表示模态视图控制器的机会。这是一个错误吗?也许,但很可能这是苹果做出的设计决策,我们必须解决它。 - lambmj
在iOS 6上没有这样的行为。我的应用程序在iOS 5上显示该行为,并在iOS 6上正常工作。 - Petr

2

这篇帖子非常有用,帮我找到了问题所在!

lambmj的答案很好,但我发现了更好的方法。在展示视图控制器时:

  - (void)viewDidAppear:(BOOL)animated {
      [super viewDidAppear:animated];
      if (self.presentedViewController) {
          UIViewController *vc = self.presentedViewController;
          [vc dismissModalViewControllerAnimated:NO];
          [self presentModalViewController:vc
                                  animated:NO];
      }
  }

希望这能帮到你!

0

@Gdx Wu @lambmj

感谢你们的方法,它们很有效。但是有一个小问题,就是在点击完成按钮并直接跳转到展示视图控制器后,我们需要解除弹出的模态视图控制器并再次呈现它,这将在这些视图控制器之间产生一些闪烁的过渡效果。

基于此,我强烈推荐@IsaacCisneros的方法,它可以实现无缝切换。


0

当 UIWebView 进入全屏模式时,简单地将其移除;当退出全屏模式时,再添加回 UIWebView。下面是示例代码,假设您的 UIViewController 具有 UIWebView 子视图,并且您的 UIWebView 应该具有 YouTube iframe。

- (void)viewDidAppear:(BOOL)animated {

[super viewDidAppear:animated];
// Add observer for "Done" button click
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerWillExitFullscreen:)
                                             name:@"UIMoviePlayerControllerWillExitFullscreenNotification"
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerDidEnterFullscreen:)
                                             name:@"UIMoviePlayerControllerDidEnterFullscreenNotification"
                                           object:nil];
}

- (void)viewDidDisappear:(BOOL)animated {

// Remove observers for "Done" button click
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil];

}

- (void)playerWillExitFullscreen:(NSNotification *)notification {

// Before exit full screen, add back UIWebView that have been removed earlier
[self.view addSubview:self.webView];
}

- (void)playerDidEnterFullscreen:(NSNotification *)notification {

if (self.presentingViewController) { // UIWebView is presenting the build-in movie player controller
    [self.webView removeFromSuperview]; // Built-in movie player controller is already entering full screen mode
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接