webViewDidFinishLoad 执行多次的问题

在做网页加载进度条的时候,发现UIWebViewDelegate中webViewDidFinishLoad方法会执行多次:

- (void)webViewDidStartLoad:(UIWebView *)webView
{
    NSLog(@"start******");
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSLog(@"end....");
}

  查阅网上资料,说网页内有异步请求或者重定向时,就会多次调用上述方法,然后证实异步请求是不是有这种情况:

例子中加载本地html文件,用js模拟异步请求:

  加载本地html:

    NSString * path = [[NSBundle mainBundle] pathForResource:@"demo11" ofType:@"html"];
    NSString * HTMLString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    [self.webView1 loadHTMLString:HTMLString baseURL:nil];

 

  js代码:

    var xhr = new XMLHttpRequest();
    xhr.open("GET","http://localhost:8080/myweb1/testserlet",true);
    xhr.send("name");
    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4){
            if(xhr.status == 200){
                alert("success!");
            }else{
                alert("failed"+xhr.status);
            }
            
        }
    }

发现webViewDidFinishLoad并没有多次执行,那么剩下的原因就是网页的重定向

解决办法是用webView.isLoading属性

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    if (webView.isLoading) {
        return;
    }
   //code... 
}

这样每进入一个新的网页,webViewDidFinishLoad只执行一次。

 

 

或者折中方法,让次方法只执行一次的话(不管网页的跳转):

定义一个属性:@property(nonatomic) BOOL isFirstLoadWeb;

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    if (!self.isFirstLoadWeb) {
        self.isFirstLoadWeb = YES;
    }else
        return;
    //code...
}

  

 

 

 先这样吧,如果有理解错误的,后边再改。。。

 

posted on 2015-12-25 09:14  银古酱  阅读(1774)  评论(0编辑  收藏  举报

导航