2012-01-30 16 views
9

Otrzymuję biały błysk, gdy mój WebView przechodzi pomiędzy adresami URL.Nawigacja Cocoa WebView biały flash

Innymi słowy, WebView jest w stanie nieodzyskanym pomiędzy nawigacją i pokazuje tylko kolor tła aplikacji.

Jakieś pomysły, jak to obejść?

+0

Czy adresy ładowanego lokalnym lub zdalnym? W jaki sposób Safari obsługuje te same linki? Czy włączono obsługę JavaScript w widoku WebKit? –

+0

To flash pomiędzy lokalnym adresem URL i zdalnym adresem URL. Uchwyt przeglądarki Safari jest natychmiastowy. Tak, JavaScript jest włączony - WebView nie jest renderowany podczas pobierania nowej strony. –

Odpowiedz

13

Miałem ten sam problem, (głównie) naprawiłem go, wprowadzając trzy metody delegatów, aby wyłączyć flush w oknie za @ justinvoss's suggestion on Twitter.

Trzeba być bardzo ostrożnym przy wyłączeniu równo na oknie ponieważ jeśli pozostawić ją wyłączoną cała aplikacja wydaje się zamrażać, więc upewnij się, że nie robią tego wielokrotnie i układać je (-webView:didCommitLoadForFrame: jest udokumentowane czasami nazwać kilka razy dla pojedynczego obciążenia) i przypadkowo zostawić okno zamrożone

@implementaton ViewControllerClass { 
    BOOL _windowFlushDisabled; 
} 


- (void)webView:(WebView *)sender didCommitLoadForFrame:(WebFrame *)frame; 
{ 
    if (!_windowFlushDisabled && sender.window) { 
     [sender.window disableFlushWindow]; 
     _windowFlushDisabled = YES; 
    } 
} 
- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame; 
{ 
    if (_windowFlushDisabled) { 
     [sender.window enableFlushWindow]; 
     [sender.window flushWindowIfNeeded]; 
     _windowFlushDisabled = NO; 
    } 
} 
- (void)webView:(WebView *)sender didFailLoadWithError:(NSError *)error forFrame:(WebFrame *)frame; 
{ 
    [self webView:sender didFinishLoadForFrame:frame]; // re-enable flushing 
} 

@end 

sporadycznie wciąż widzę błyski, moja obecna teoria mówi, że ta funkcja zwrotna jest wtedy, gdy wszystkie zasoby są ładowane ale że rysunek niekoniecznie jest skończone. Szkoda, że ​​to jedyny oddzwaniany telefon.

Jeśli jesteś na 10,6 lub lepiej można pracować wokół nich za pomocą tej sztuczki aby opóźnić równo umożliwienie aż do końca imprezy:

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame; 
{ 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
     if (_windowFlushDisabled) { 
      [self.libraryDocument.windowForSheet enableFlushWindow]; 
      [self.libraryDocument.windowForSheet flushWindowIfNeeded]; 
      _windowFlushDisabled = NO; 
     } 
    }]; 
}