UIWebView加载解析的html字符串

Sor*_*ohi 6 html string iphone parsing uiwebview

我正在构建一个应用程序,它将向用户显示一些新闻简报.新闻简报显示在uiWebView中.我正在阅读来自RSS Feed的简报的网址.我解析xml,在表格视图中我有所有的新闻简报.单击单元格时,将推送uiWebView并加载新闻稿.因为uiWebView没有打开具有target = _blank的链接,所以我需要用""替换目标中的_blank.在NSOperation中我下载了html的内容,在下载完成后我替换了这样的字符串:

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

在我这样做之后,我在webView中加载解析后的字符串,将其显示给用户.

[myWebView loadHTMLString:page baseURL:[NSURL URLWithString:@""]];
Run Code Online (Sandbox Code Playgroud)

当NSOperation正在下载页面内容时,HUD带有一个活动指示器和一个标签,显示正在显示加载.下载完成后,HUD将从superview中删除.

到目前为止一直这么好..但是这里有问题.我使用NSOperation和回调函数,因为我无法确定最后一次调用webDidFinishLoading(我读了这个UIWebView - 如何识别"最后"的webViewDidFinishLoad消息? - 这是我的问题的一部分,但响应是使用一些Apple私人课程,这对我来说是个问题).所以我这样做:

- (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;
Run Code Online (Sandbox Code Playgroud)

}

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

在我触摸表格视图中的单元格并显示它看起来应该是新闻通讯时,当我点击时事通讯中的链接时,页面加载了新请求,解析但是在视觉上看起来不应该(我看起来)在NSLog中解析后的页面,它有css样式和html标签,头部,正文打开和关闭正确)任何人都有uiWebView这个问题,没有正确显示网页?

我尝试加载页面- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{ return YES; } 和 - (void)webViewDidFinishLoad:(UIWebView*)webview {}和 - webViewDiStartLoad

但是为webview中加载的每个项目调用方法,因此在这些方法中显示和隐藏HUD不是一个好的解决方案.

我在使用时遇到了一些问题 - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {... return NO}

例如,像/ this/bilder-galerien这样的路径无法正常工作的链接,在NSLog中我会收到这些链接

未知计划,什么都不做:/ bilder-galerien

但是当我使用的时候

  • (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)请求navigationType:(UIWebViewNavigationType)navigationType {return Yes}和didstartLoading和finishLoading网址被加载,我不知道为什么...

另一个问题是特殊的德语字符..在我的第一次加载(在uiTableView中按下一个单元格后)页面被解析为应该是由uiWebView但是在我点击一个链接并加载相应的请求后,字符也不是正确解析..

谁能指出我的好方向?先感谢您

Sor*_*ohi 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];
}
Run Code Online (Sandbox Code Playgroud)