iPhone SDK:用于停止加载/下载图像的UIWebView

问题描述:

如何在Xcode中使用UIWebView,以便在加载页面时不会下载图像(导致更快的加载页面)?iPhone SDK:用于停止加载/下载图像的UIWebView

UIWebView是WebKit完整的WebView苍白,可怜的小阴影,为此很容易。 -webView:shouldStartLoadWithRequest:navigationType:只会被调用导航。它不会在mac上为每个请求调用WebPolicyDelegate。与UIWebView,这里是我将如何攻击这个问题:

执行-webView:shouldStartLoadWithRequest:navigationType:并将其设置为始终返回NO。但你也会接受请求并产生一个NSURLConnection。当NSURLConnection完成提取数据时,您将通过它查看任何IMG标记并将其修改为任何您想要的占位符。然后,您将使用-loadHTMLString:baseURL:将结果字符串加载到UIWebView中。

当然在iPhone上解析HTML并不是一件简单的事情,Javascript的载入器会给你带来麻烦,所以这不是一个完美的答案,但它是我所知道的最好的。

是在UIWebView的委托,然后截取电话:navigationType的

– webView:shouldStartLoadWithRequest:navigationType: 

检查值的文档。我相信你会得到最好的回报NOnavigationType == UIWebViewNavigationTypeOther

+0

webView:shouldStartLoadWithRequest:navigationType:在下载发生后被调用。 – Harry 2009-05-03 09:26:27

这实际上是否导致页面加载速度更快? 它听起来像图像仍在下载,但我们只是没有喂它们到UIWebView。

还是shouldStartLoadWithRequest只是首先加载HTML文本?

扩展Rob的答案。 我注意到,当loadHTMLString:baseURL:并且总是返回NO时,该webView:shouldStartLoadWithRequest:navigationType:只是不停地被调用。 (我怀疑loadHTMLString调用另一个shouldStartLoadWithRequest)。

所以我不得不做回之间是交替YES/NO ,我用NSScanner解析HTML和变化SRC = “HTTP:// ......” 为src = “”

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    if (pageHasNoImages==YES) 
    { 
     pageHasNoImages=FALSE; 
     return YES;  
    } 
    NSString* newHtml; 
    NSString* oldHtml; 
    NSData *urlData; 
    NSURLResponse *response; 
    NSError *error; 
    urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
    oldHtml=[[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding]; 

    newHtml=[self.detail scannerReplaceImg:oldHtml]; // my own function to parse HTML 
    newHtml=[self.detail scannerReplaceAds:newHtml]; // my own function to parse HTML 
    if (newHtml==nil) 
    { 
     NSLog(@"newHtml is nil"); 
     newHtml=oldHtml; 
    } 
    [oldHtml release]; 

    pageHasNoImages=TRUE; 
    [web loadHTMLString:newHtml baseURL:request.URL]; 

    return NO; 
}