Воспроизводя видео YouTube в uiwebview. Как обращаться с кнопкой "done"?

У меня есть uiwebview, который воспроизводит видео с YouTube. Как я могу обработать действие кнопки "Готово"? Прямо сейчас, когда я нажимаю кнопку "Готово", она возвращается обратно в главное меню приложения (а не в меню, которое должно было отклоняться), и оно просто зависает. Кто-нибудь может мне помочь?

Ps: меню, в котором расположено uiwebview, ранее было представлено модально.

Ответ 1

Проигрыватель YouTube сам по себе является модульным контроллером. Он возвращается к presentingViewController при нажатии кнопки done. Его presentingViewController не является вашим модульным контроллером вида, а вместо него является viewController, который вызвал [presentModalViewController:animated:], чтобы представить ваш контроллер модального представления. Поскольку исходный контроллер модального представления все еще активен, приложение ведет себя плохо.

Чтобы устранить проблему,

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

Ответ 2

Этот поток очень полезен и помогает мне найти проблему!

Ответ lambmj отлично работает, но я нашел лучший способ. При представлении контроллера представления:

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

Надеюсь, это поможет!

Ответ 3

@Gdx Wu @lambmj

Спасибо за ваши методы, они отлично работают. Но есть небольшая проблема, что после нажатия кнопки "Готово" и перехода непосредственно к представлению контроллера представления нам нужно убрать представленный контроллер модального представления и представить его снова, что приведет к некоторому сглаживанию (например, вспышке) между этими переключателями контроллера просмотра.

Исходя из этого, я настоятельно рекомендую метод @IsaacCisneros, который будет легко переключаться.

Ответ 4

Просто удалите UIWebView, когда он войдет во весь экран; добавьте обратно UIWebView при выходе из полноэкранного режима. Пример кода ниже предполагает UIViewController с подвью UIWebView, и ваш UIWebView должен иметь iframe 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
}
}