10
votes

Jouer une vidéo YouTube Inside UiWebView. Comment gérer le bouton "Terminé"?

J'ai une uiWebView qui joue une vidéo YouTube. Comment puis-je gérer l'action du bouton fait? En ce moment, lorsque j'appuyez sur le bouton Terminé, il passe à mon menu principal de mon application (pas le menu censé renvoyer à) et il gèle simplement. Quelqu'un peut-il m'aider s'il vous plaît?

PS: le menu où se trouve l'UIWebView, a déjà été présenté de manière modale.


2 commentaires

Vous avez trouvé une solution à votre problème, pouvez-vous le partager avec nous?


pas encore ... je ne l'ai pas trouvé


4 Réponses :


8
votes

Le joueur de plug-in YouTube est lui-même un contrôleur de vue modal. Il retourne à son PrésentationViewController code> lorsque le bouton Terminé est enfoncé. Son PrésentationViewController code> n'est pas votre contrôleur de vue modal, mais est la page ViewController appelée [PresentModalViewController: animée:] code> pour présenter votre contrôleur de vue modal. Étant donné que le contrôleur d'affichage modal d'origine est toujours actif, l'application se comporte mal.

Pour résoudre le problème, P>

1) Suivez si le contrôleur de vue modal a été présenté mais non rejeté. P> 2) Dans la méthode Code> ViewDidIDAppear Code> du contrôleur de la vue de présentation, si le contrôleur de vue modale a été présenté et non rejeté, rejeter et présentez-le à nouveau. P>

Par exemple, dans le contrôleur qui présente le contrôleur de visualisation Web modal: P>

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


4 commentaires

Cette méthode ne fonctionne que si vous rejetez la vue WebController dans ViewDidAppear et dans mon cas, il se bloque si je le fais dans la viewwillappear. Soyez prudent avec ça. Merci pour le conseil


Cela fonctionne bien, merci. Quelqu'un sait-il pourquoi nous devons faire cela en premier lieu? Est-ce un bug de Uikit, ou y a-t-il quelque chose que je suis mal compris sur les contrôleurs de vue modale?


Dans ce cas, l'UIWebView est présentée de manière modale et le plug-in You Tube présenté sur le dessus est présenté de manière modale. Nous avons donc un contrôleur de vue modal présentant un contrôleur de vue modal. Uikit s'attend à ce qu'il n'y ait jamais un seul contrôleur de visualisation modal présentée et lorsque le sommet est rejeté, ceux-ci sont également licenciés. Lorsque cela se produit, le contrôleur de la vue de base est appelé avec ViewDidAppear: et nous donne une chance de représenter à nouveau notre contrôleur de vue modal. Est-ce un bug? Peut-être que c'est probablement une décision de conception appelle que nous devons travailler.


Sur iOS 6, il n'y a pas de comportement de ce type. Mon application montre que le comportement sur iOS 5 et fonctionne normalement sur iOS 6.



2
votes

Ce fil est très utile et m'aidez à trouver le problème!

La réponse de LambmJ fonctionne bien, mais j'ai trouvé une meilleure façon. Dans la présentation du contrôleur d'affichage: xxx

espère que cela aide!


0 commentaires

0
votes

@gdx wu @LAMBMJ

Merci pour vos méthodes, elles fonctionnent bien. Mais il y a un faible problème qui après avoir cliqué sur le bouton Terminé et à sauter directement sur le contrôleur de la vue Présentation, nous devons rejeter le contrôleur de vue modal présenté et le présenter à nouveau, ce qui apporterait un peu (comme Flash) entre ces commutateurs de contrôleur View.

Basé sur ceci, je recommande vivement @isaaccisteuros '' SHOD ''


0 commentaires

0
votes

supprimer simplement uiwebview lorsqu'il entre en plein écran; Ajouter UIWebView quand il quitte plein écran. Exemple de code ci-dessous en supposant un UIViewController avec Sous-site d'UIWebView, et votre UIWebView devrait avoir 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
}
}


0 commentaires