2011-12-07 5 views
10

Mam widok uiweb, który odtwarza wideo z youtube. Jak mogę obsłużyć wykonaną czynność przycisku? W tej chwili, po dotknięciu przycisku Gotowe zmienia się z powrotem do menu głównego aplikacji (nie menu, które miało zostać odrzucone) i po prostu zawiesza się. Czy ktoś może mi pomóc?Odtwarzanie wideo youtube w widoku uiwebview. Jak obsługiwać przycisk "done"?

Ps: menu, w którym znajduje się widok uwewebview, zostało wcześniej przedstawione modalnie.

+0

Znalazłem rozwiązanie Twojego problemu. Czy możesz je nam udostępnić? – Illep

+0

jeszcze nie ... Nie znalazłem tego – jonypz

Odpowiedz

8

Odtwarzacz wtyczek YouTube sam w sobie jest kontrolerem widoku modalnego. Po naciśnięciu przycisku powraca on do numeru presentingViewController. Jego presentingViewController nie jest twoim kontrolerem widoku modalnego, ale zamiast tego jest obiektem viewController, który wywołał [presentModalViewController:animated:], aby zaprezentować swój kontroler widoku modalnego. Ponieważ oryginalny kontroler widoku modalnego jest nadal aktywny, aplikacja zachowuje się źle.

Aby rozwiązać ten problem,

1) Tor, czy kontroler modalne widok został przedstawiony, ale nie oddalił.

2) W metodzie przedstawiania kontrolera widoku viewDidAppear, jeżeli kontroler widoku modalnego został przedstawiony i nie został odrzucony, należy go odrzucić i przedstawić ponownie.

Na przykład w kontrolerze, który prezentuje modalne Zobacz Web Kontroler:

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

Ten metode działa TYLKO po dezorientacji webviewController w VIEWDIDAPPEAR iw moim przypadku zawiesza się, jeśli robię to w VIEWWILLAPPEAR. Bądź z tym ostrożny. dzięki za cynk – Vassily

+0

To działa świetnie, dziękuję. Czy ktoś wie, dlaczego musimy to zrobić w pierwszej kolejności? Czy jest to błąd w UIKit, czy jest coś, czego nie rozumiem na temat kontrolerów widoku modalnego? – Defragged

+2

W tym przypadku UIWebView jest prezentowany modalnie, a wtyczka You Tube prezentowana na nim jest również prezentowana modalnie. Mamy więc kontroler widoku modalnego przedstawiający kontroler widoku modalnego.UIKit spodziewa się, że tylko jeden kontroler widoku modalnego zostanie zaprezentowany, a ten, który zostanie odrzucony, również zostanie odrzucony. Kiedy tak się dzieje, kontroler widoku podstawowego zostaje wywołany z viewDidAppear: i daje nam szansę ponownego reprezentowania naszego kontrolera widoku modalnego. Czy to błąd? Być może, ale prawdopodobnie jest to decyzja projektowa, którą Apple postanowił wykonać. – lambmj

2

Ten wątek jest bardzo przydatne i pomogą mi znaleźć ten problem!

Odpowiedź lambmj działa dobrze, ale znalazłem lepszy sposób. Przedstawiając kontroler widoku:

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

Mam nadzieję, że to pomoże!

0

@Gdx Wu @lambmj

Dzięki za metodami, pracują dobrze. Ale jest mały problem, który po kliknięciu wykonanego przycisku & przeskakując bezpośrednio do kontrolera widoku prezentacji, musimy odrzucić przedstawiony kontroler widoku modalnego i zaprezentować go ponownie, co przyniesie trochę ditheringu (np. Flash) pomiędzy tymi przełącznikami kontrolera widoku.

Opierając się na tym, bardzo polecam metodę @IsaacCisneros, która przełączałaby się płynnie.

0

Po prostu usuń UIWebView po przejściu na pełny ekran; dodaj UIWebView z powrotem po wyjściu z trybu pełnoekranowego. Przykładowy kod poniżej zakładający UIViewController z podziałem na UIWebView, a twój UIWebView powinien mieć ifrube iftube.

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