我有一個uiwebview播放YouTube視頻。我如何處理完成按鈕操作? 現在,當我點擊完成按鈕時,它會變回我的應用程序主菜單(而不是應該解僱的菜單),並且它會凍結。任何人都可以幫助我嗎?。如何處理「完成」按鈕?
ps:uiwebview所在的菜單以前是以模態方式呈現的。
我有一個uiwebview播放YouTube視頻。我如何處理完成按鈕操作? 現在,當我點擊完成按鈕時,它會變回我的應用程序主菜單(而不是應該解僱的菜單),並且它會凍結。任何人都可以幫助我嗎?。如何處理「完成」按鈕?
ps:uiwebview所在的菜單以前是以模態方式呈現的。
YouTube插件播放器本身就是一種模式視圖控制器。當完成按鈕被按下時,它返回到其presentingViewController
。它的presentingViewController
不是你的模態視圖控制器,而是調用[presentModalViewController:animated:]
來顯示你的模態視圖控制器的viewController。由於原始模式視圖控制器仍處於活動狀態,因此該應用程序表現不佳。
要解決該問題,
1)軌道中的模態視圖控制器是否已經呈現但不駁回。
2)在呈現視圖控制器的viewDidAppear
方法中,如果呈現模態視圖控制器並且未解散,則解除並再次呈現它。
例如,在控制器的呈現模式的網絡視圖控制器:
- (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];
}
}
只有在VIEWDIDAPPEAR中關閉webviewController,並且在我的情況下,如果我在VIEWWILLAPPEAR中執行它,它纔會崩潰。要小心這個。感謝您的提示 – Vassily
這很好,謝謝。有人知道我們爲什麼必須這樣做嗎?它是UIKit中的錯誤,還是我對模態視圖控制器有誤解? – Defragged
在這種情況下,UIWebView以模態方式呈現,並且在其上呈現的You Tube插件也以模態方式呈現。所以我們有一個模態視圖控制器來呈現一個模態視圖控制器。UIKit預計只會有一個模態視圖控制器出現,當頂層控制器被解散時,它下面的控制器也被解散。當發生這種情況時,基本視圖控制器會被viewDidAppear調用:並且讓我們有機會再次表示我們的模式視圖控制器。這是一個錯誤嗎?也許但可能這是蘋果公司做出的設計決定,我們必須解決。 – lambmj
這個線程是非常有用的,幫助我找到問題所在!
lambmj的答案很好,但我找到了一個更好的方法。 在呈現視圖控制器:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if (self.presentedViewController) {
UIViewController *vc = self.presentedViewController;
[vc dismissModalViewControllerAnimated:NO];
[self presentModalViewController:vc
animated:NO];
}
}
希望這有助於!
@Gdx吳 @lambmj
感謝您的方法,他們工作得很好。但是有一個小問題,點擊完成按鈕&直接跳到呈現視圖控制器,我們需要關閉所呈現的模式視圖控制器並再次呈現它,這會在這些視圖控制器開關之間引起一些抖動(如閃光)。
基於此,我強烈建議@IsaacCisneros的方法可以無縫切換。
當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
}
}
已找到解決方案,您可以與我們分享嗎? – Illep
尚未...我還沒有找到它 – jonypz