2011-12-07 20 views
10

Tengo una página web que reproduce un video de youtube. ¿Cómo puedo manejar la acción del botón hecho? En este momento, cuando toco el botón "done", vuelve al menú principal de mi aplicación (no al menú que se suponía que debía ignorar) y simplemente se congela. ¿Alguien puede ayudarme por favor?reproduciendo video de youtube dentro de uiwebview. ¿Cómo manejar el botón "hecho"?

Ps: el menú donde se encuentra uiwebview, se presentó previamente de forma modal.

+0

Han encontrado la solución a su problema, ¿puedes compartirlo con nosotros? – Illep

+0

aún no ... No lo he encontrado – jonypz

Respuesta

8

El reproductor de complementos de YouTube es en sí mismo un controlador de vista modal. Está volviendo a su presentingViewController cuando se presiona el botón hecho. Su presentingViewController no es su controlador de vista modal, sino que es viewController que llamó al [presentModalViewController:animated:] para presentar su controlador de vista modal. Como el controlador de vista modal original todavía está activo, la aplicación se comporta mal.

Para solucionar el problema,

1) Seguir si el controlador de vista modal se haya presentado pero no descartado.

2) En el método viewDidAppear del controlador de vista de presentación, si el controlador de vista modal se presentó y no se descarta, deséchelo y preséntelo nuevamente.

Por ejemplo, en el controlador que está presentando el controlador de vista modal 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

Este método funciona ÚNICAMENTE si rechaza el webviewController en VIEWDIDAPPEAR y en mi caso, se bloquea si lo hago en VIEWWILLAPPEAR. Ten cuidado con eso. gracias por la punta – Vassily

+0

Eso funciona muy bien, gracias. ¿Alguien sabe por qué tenemos que hacer esto en primer lugar? ¿Es un error en UIKit, o hay algo que no entiendo bien sobre los controladores de vista modal? – Defragged

+2

En este caso, UIWebView se presenta de forma modal y el complemento de You Tube presentado encima también se presenta de forma modal. Entonces tenemos un controlador de vista modal que presenta un controlador de vista modal.UIKit espera que solo haya un único controlador de vista modal presentado y cuando se descarta el de arriba, los que están debajo se descarten también. Cuando eso sucede, el controlador de vista base se llama con viewDidAppear: y nos da la oportunidad de representar nuestro controlador de vista modal de nuevo. ¿Es un error? Tal vez, pero probablemente es una decisión de diseño que Apple hizo que tenemos que trabajar. – lambmj

2

Este hilo es muy útil y me ayude a encontrar el problema!

La respuesta de lambmj funciona bien, pero encontré una mejor manera. En la presentación de controlador de vista:

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

Espero que esto ayude!

0

@Gdx Wu @lambmj

Gracias por sus métodos, que funciona bien. Pero hay un pequeño problema que después de hacer clic en el botón & saltando directamente al controlador de vista presentador, debemos descartar el controlador de vista modal presentado y presentarlo de nuevo, lo que provocaría un temblor (como destello) entre estos interruptores del controlador de vista.

En base a esto, recomiendo encarecidamente el método @IsaacCisneros que cambiaría sin problemas.

0

Simplemente elimine UIWebView cuando entre en pantalla completa; vuelve a agregar UIWebView cuando sale de la pantalla completa. El código de muestra a continuación supone un UIViewController con subvista de UIWebView, y su UIWebView debe tener el iframe de 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 
} 
} 
Cuestiones relacionadas