我有一个播放youtube视频的uiwebview。如何处理完成按钮操作? 现在,当我点击完成按钮时,它会更改回我的应用程序主菜单(而不是应该关闭的菜单),它就会冻结。有人可以帮帮我吗?
Ps:uiwebview所在的菜单,以前是以模态方式呈现的。
答案 0 :(得分:8)
YouTube插件播放器本身就是一个模态视图控制器。按下完成按钮后,它将返回presentingViewController
。它的presentingViewController
不是你的模态视图控制器,而是调用[presentModalViewController:animated:]
来显示你的模态视图控制器的viewController。由于原始模态视图控制器仍处于活动状态,因此应用程序表现不佳。
要解决问题,
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 :(得分:2)
这个帖子非常有用,可以帮助我找到问题!
lambmj的答案很好,但我找到了更好的方法。 在呈现视图控制器时:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if (self.presentedViewController) {
UIViewController *vc = self.presentedViewController;
[vc dismissModalViewControllerAnimated:NO];
[self presentModalViewController:vc
animated:NO];
}
}
希望这有帮助!
答案 2 :(得分:0)
@Gdx吴 @lambmj
感谢您的方法,他们工作正常。但是点击完成按钮后会出现一些小问题。直接跳到呈现视图控制器,我们需要关闭呈现的模态视图控制器并再次呈现它,这将在这些视图控制器开关之间带来一些抖动(如闪光)。
基于此,我强烈推荐@IsaacCisneros无缝切换的方法。
答案 3 :(得分: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
}
}