2009-07-18 159 views
6

我正在構建一個應用程序,它會向用戶顯示一些新聞簡報。新聞簡報顯示在uiWebView中。我正在閱讀來自rss feed的新聞簡報的網址。我解析XML,並在表格視圖中,我有所有的通訊。單擊單元格時,會推送uiWebView並加載新聞簡報。因爲uiWebView沒有打開具有target = _blank的鏈接,我需要用「」替換目標中的_blank。在我的NSOperation下載HTML的內容和下載完成後我替換字符串是這樣的:UIWebView加載解析的html字符串

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

我做到這一點後,我加載解析字符串中的web視圖來顯示給用戶。

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

而被的NSOperation下載頁的HUD的內容與活動指示燈和說加載顯示的標籤。下載完成後,HUD將從超級視圖中移除。

到目前爲止這麼好..但在這裏來的問題。我用NSOperation與回調函數,因爲我無法確定最後一次調用webDidFinishLoading(我讀這UIWebView - How to identify the "last" webViewDidFinishLoad message? - 這是我的問題的一部分,但答覆是使用一些蘋果私人類,這是一個問題我)。之後,我在表視圖觸摸單元和簡訊表明,它看起來像它應該,當我在通訊中點擊一個鏈接

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

:所以我這樣做,頁面加載了新的請求,解析但在視覺上看起來不像它應該(我在NSLog解析後看了頁面,它有CSS樣式和html標籤,頭部,正文打開和正確關閉)任何人都有這個uiWebView的問題,沒有正確顯示網頁?

我試着用- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{ return YES; } 和加載頁面 - (空)webViewDidFinishLoad:(UIWebView的*)的WebView {}和 - webViewDiStartLoad

但是這些方法被稱爲爲每個在web視圖加載項因此在這些方法中顯示和隱藏HUD並不是一個好的解決方案。

我遇到了一些問題,而使用 - (BOOL)webView的:(UIWebView的*)webView的shouldStartLoadWithRequest:(*的NSURLRequest)請求navigationType:(UIWebViewNavigationType)navigationType {...返回NO}

對於具有示例鏈接像這樣/ BILDER-galerien路徑沒有工作,在我的NSLog收到此對他們

未知的方案,什麼都不做: /BILDER-galerien

但WH恩我使用

  • (BOOL)webView的:(UIWebView的*)webView的shouldStartLoadWithRequest:(*的NSURLRequest)請求navigationType:(UIWebViewNavigationType)navigationType {返回是}和didstartLoading和finishLoading的網址被加載,我不知道爲什麼...

另一個問題是德國的特殊字符..在我的第一負載(後中的UITableView按下電池)的頁面解析像它應該是由一個UIWebView但之後,我點擊一個鏈接,並加載也是字符,不能正確解析相應的請求..

能任何人都指向我的好方向?預先感謝您

+0

不要一遍又一遍地回答你自己的問題! – SK9 2011-04-15 09:08:39

回答

4

UIWebView不會打開target =「_ blank」鏈接。某些鏈接不會觸發UIWebViewNavigationTypeLinkClicked事件。當鏈接具有target =「_ blank」屬性時會發生這種情況。

要解決此問題,我使用下面的代碼。它會在頁面加載後注入一些javascript以從所有鏈接中刪除目標屬性。在使用這段代碼之後,我再也不需要解析html源代碼,並用_self代替_blank。

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

我喜歡索麗娜答案,我們可以讓它變得更好用:

  • 避免阻礙JavaScript和var d
  • ,因爲我們知道我們正在運行WebKit引擎,我們可以使用選擇:

...所以在你的UIWebViewDelegate協議方法調用js代碼:

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