你的位置:首页 > 操作系统

[操作系统]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 "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...}

  

 

 

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