2009-07-18 16 views
6

Buduję aplikację, która będzie wyświetlać użytkownikom newslettery. biuletyny są wyświetlane w uiWebView. Czytam adresy URL newsletterów z kanału RSS. Analizuję xml, aw widoku tabeli mam wszystkie biuletyny. Po kliknięciu na komórkę moduł uiWebView zostanie naciśnięty, a biuletyn zostanie załadowany. Ponieważ uiWebView nie otwiera odnośników, które mają cel = _blank, muszę zastąpić _blank z miejsca docelowego "". W NSOperation pobrać zawartości html i po zakończeniu pobierania wymienić struny tak:UIWebView ładowanie przeanalizowanego łańcucha html

NSMutableString *page = [[[NSMutableString alloc] initWithData:pageData encoding:NSISOLatin1StringEncoding] autorelease]; [page replaceOccurrencesOfString:@"target=_blank" withString:@"target=""" options:0 range:NSMakeRange(0, [page length])]; 

po tym, jak to zrobić i załadować analizowany ciąg w Webview aby wyświetlić go do użytkownika.

[myWebView loadHTMLString:page baseURL:[NSURL URLWithString:@""]]; 

natomiast NSOperation pobiera zawartość strony HUD ze wskaźnikiem aktywności i etykiety, która mówi ładuje się pokazał. Po zakończeniu pobierania HUD zostanie usunięty z superview.

jak dotąd tak dobrze .., ale tutaj przychodzą pytania. użyłem NSOperation z funkcją wywołania zwrotnego, ponieważ nie byłem w stanie określić ostatniego wywołania webDidFinishLoading (przeczytałem to UIWebView - How to identify the "last" webViewDidFinishLoad message? - jest to część mojego problemu, ale odpowiedzią było użycie niektórych prywatnych klas Apple i jest to problem dla mnie). tak ja to robię:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { 


NSURL *url = request.URL; 
NSString *urlString = url.absoluteString; 
NSLog(@"WebViewSouldStartWithRequest: %@", urlString); 
if (navigationType == UIWebViewNavigationTypeLinkClicked) 
{ 
    if(![urlString isEqualToString:@"about:blank"]) 
    { 
     NSLog(@"FeedViewController: startPageLoad"); 
     activityHud = [[HUDView alloc] initWithFrame:CGRectMake(110, 100, 80, 80)]; 
     [activityHud setText:@"Loading"]; 
     [myWebView addSubview:activityHud]; 
     NSLog(@"FeedViewController: pageUrl = %@", urlString); 
     [self resetWebView]; 
     [urlLoader loadPageFromUrl:request.URL withCallbackTarget:self withCallbackSelector:@selector(endLoading:)]; 
    } 
} 

return NO; 

}

- (void) endLoading:(NSMutableString *)page { [self resetWebView]; NSLog(@"FeedViewController: endLoading"); [activityHud removeFromSuperview]; [myWebView loadHTMLString:page baseURL:[NSURL URLWithString:@""]]; } 

po dotykam komórkę w widoku tabeli i biuletynu jest pokazał wygląda tak jak powinien, po kliknięciu linku w newsletterze , strona jest ładowana z nowym żądaniem, parsowana, ale wizualnie nie wygląda tak jak powinna (patrzę na stronę po parsowaniu w NSLog i ma style CSS i znaczniki html, głowa, ciało otwarte i zamknięte poprawnie) każdy miał to problem z uiWebView, nie wyświetlając poprawnie stron internetowych?

Próbowałem ładowania strony z - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{ return YES; } i - (void) webViewDidFinishLoad: (UIWebView *) Webview {} i in - webViewDiStartLoad

ale metody są wywoływane dla każdego elementu, który jest załadowany do WebView więc pokazywanie i ukrywanie HUD w tej metodzie nie jest dobrym rozwiązaniem.

I napotkał pewne problemy podczas korzystania - (BOOL) Webview: (UIWebView *) Webview shouldStartLoadWithRequest: (*) Wniosek NSURLRequest navigationType: (UIWebViewNavigationType) navigationType {...} nie zwraca

na przykład linki, które mają ścieżki takie jak ta/Bilder-Galerien nie działa iw NSLog i odbierać to dla nich

wiadomo schemat, nic nie robi: /bilder-Galerien

ale WH pl używam

  • (BOOL) Webview: (UIWebView *) Webview shouldStartLoadWithRequest: (NSURLRequest *) prośba navigationType: (UIWebViewNavigationType) navigationType {return YES} i didstartLoading i finishLoading adresy URL są ładowane i nie wiem dlaczego ...

Kolejnym problemem są specjalne niemieckie znaki ..w moim pierwszym załadowaniu (po naciśnięciu komórki w interfejsie uiTableView) strona jest analizowana tak, jak powinna być przez uiWebView, ale po kliknięciu łącza i odpowiednie żądanie jest ładowane również znaki nie są poprawnie przetwarzane.

puszka ktoś wskazuje na mnie w dobrym kierunku? z góry dziękuję

+0

Przestań odpowiadać na swoje pytanie w kółko! – SK9

+1

@ SK9: usunąłem odpowiedzi .. ale następnym razem proszę o odpowiedź na pytanie, jeśli możesz! –

Odpowiedz

4

UIWebView nie otwiera linków target = "_ blank". Niektóre linki nie wywołują zdarzeń UIWebViewNavigationTypeLinkClicked. Dzieje się tak, gdy link ma atrybut target = "_ blank".

Aby obejść ten problem, użyłem poniższego kodu. Wprowadza część javascript po wczytaniu strony, aby usunąć atrybut docelowy ze wszystkich linków. Po użyciu tego kodu już nie potrzebowałem parsować źródła html i na przykład zastąpić _blank przez _self.

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
     NSString *js = @"\ 
     var d = document.getElementsByTagName('a');\ 
     for (var i = 0; i < d.length; i++) {\ 
      if (d[i].getAttribute('target') == '_blank') {\ 
       d[i].removeAttribute('target');\ 
      }\ 
     }\ 
     "; 

     [webView stringByEvaluatingJavaScriptFromString:js]; 
} 
3

Lubię Sorina odpowiedź, możemy uczynić go jeszcze lepiej:

  • uniknięcia utrudnień javascript z var d
  • jak wiemy mamy uruchomiony silnik WebKit możemy używać selektorów:

... więc w swojej metodzie protokołu UIWebViewDelegate wywołaj kod js:

- (void) webViewDidFinishLoad: (UIWebView *) webView { 
    [webView stringByEvaluatingJavaScriptFromString: @"(function($){for(var i=0;i<$.length;++i){$[i].removeAttribute('target')}})(document.querySelectorAll('a[target=_blank]'))"]; 
} 
Powiązane problemy