2009-07-18 124 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]'))"]; 
}