2011-12-07 81 views
10

我有一個uiwebview播放YouTube視頻。我如何處理完成按鈕操作? 現在,當我點擊完成按鈕時,它會變回我的應用程序主菜單(而不是應該解僱的菜單),並且它會凍結。任何人都可以幫助我嗎?。如何處理「完成」按鈕?

ps:uiwebview所在的菜單以前是以模態方式呈現的。

+0

已找到解決方案,您可以與我們分享嗎? – Illep

+0

尚未...我還沒有找到它 – jonypz

回答

8

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]; 
     } 
    } 
+1

只有在VIEWDIDAPPEAR中關閉webviewController,並且在我的情況下,如果我在VIEWWILLAPPEAR中執行它,它纔會崩潰。要小心這個。感謝您的提示 – Vassily

+0

這很好,謝謝。有人知道我們爲什麼必須這樣做嗎?它是UIKit中的錯誤,還是我對模態視圖控制器有誤解? – Defragged

+2

在這種情況下,UIWebView以模態方式呈現,並且在其上呈現的You Tube插件也以模態方式呈現。所以我們有一個模態視圖控制器來呈現一個模態視圖控制器。UIKit預計只會有一個模態視圖控制器出現,當頂層控制器被解散時,它下面的控制器也被解散。當發生這種情況時,基本視圖控制器會被viewDidAppear調用:並且讓我們有機會再次表示我們的模式視圖控制器。這是一個錯誤嗎?也許但可能這是蘋果公司做出的設計決定,我們必須解決。 – lambmj

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吳 @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 
} 
}