2011-12-07 2 views
10

Ho un Uiwebview che riproduce un video di YouTube. Come posso gestire l'azione del pulsante fatto? In questo momento, quando tocchi il pulsante Fine, questo torna al menu principale della mia app (non al menu che dovrebbe essere ignorato) e si blocca appena. Qualcuno mi può aiutare per favore?riproduzione video di youtube all'interno di uiwebview. Come gestire il pulsante "fatto"?

Ps: il menu in cui si trova uiwebview è stato precedentemente presentato in modo modale.

+0

Hai trovato una soluzione al tuo problema, puoi condividerlo con noi? – Illep

+0

non ancora ... Non l'ho trovato – jonypz

risposta

8

Il plug-in player di YouTube è esso stesso un controller di visualizzazione modale. Sta tornando al suo presentingViewController quando viene premuto il pulsante Fine. Il suo presentingViewController non è il controller della visualizzazione modale, ma è invece il viewController che ha chiamato [presentModalViewController:animated:] per presentare il controller della visualizzazione modale. Poiché il controller della visualizzazione modale originale è ancora attivo, l'app si comporta male.

per risolvere il problema,

1) La traccia se il controller di vista modale è stato presentato, ma non licenziato.

2) Nel metodo viewDidAppear del controller della vista di presentazione, se il controller della vista modale è stato presentato e non eliminato, chiuderlo e presentarlo di nuovo.

Ad esempio, nel controller che presenta la visualizzazione Web di controllo modale:

- (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

Questo metodo funziona SOLO se si dissocia il webviewController in VIEWDIDAPPEAR e nel mio caso si blocca se lo faccio in VIEWWILLAPPEAR. Stai attento con quello. grazie per il suggerimento – Vassily

+0

Che funziona benissimo, grazie. Qualcuno sa perché dobbiamo farlo in primo luogo? E 'un bug in UIKit, o c'è qualcosa che sto fraintendendo sui controller di visualizzazione modali? – Defragged

+2

In questo caso UIWebView viene presentato in modo modale e il plug-in di You Tube presentato sopra viene presentato anche in modo modale. Quindi abbiamo un controller di visualizzazione modale che presenta un controller di visualizzazione modale.Uikit si aspetta che ci sia sempre un solo controller di visualizzazione modale presentato e quando quello superiore viene eliminato, anche quelli sottostanti vengono ignorati. Quando ciò accade, il controller della vista di base viene chiamato con viewDidAppear: e ci dà la possibilità di rappresentare nuovamente il nostro controller di visualizzazione modale. E 'un errore? Forse, ma probabilmente è una decisione di design che Apple ha fatto che dobbiamo lavorare. – lambmj

2

Questo thread è molto utile e mi aiuta a trovare il problema!

La risposta di lambmj funziona bene, ma ho trovato un modo migliore. Nel presentare View Controller:

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

Spero che questo aiuti!

0

@Gdx Wu @lambmj

Grazie per i vostri metodi, funzionano bene. Ma c'è qualche piccolo problema che dopo aver fatto clic sul pulsante di completamento & saltando direttamente al controller di presentazione presentando, abbiamo bisogno di chiudere il controller di visualizzazione modale presentato e presentarlo di nuovo, che porterebbe qualche dither (come flash) tra questi switch del controller di visualizzazione.

Sulla base di questo, consiglio vivamente il metodo @IsaacCisneros che passerebbe senza interruzioni.

0

Basta rimuovere UIWebView quando entra a pieno schermo; aggiungere UIWebView quando esce dallo schermo intero. Esempio di codice sotto assumendo un UIViewController con sottoview di UIWebView e UIWebView dovrebbe avere iframe di youtube.

- (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 
} 
}