在做網頁載入進度條的時候,發現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...
}
先這樣吧,如果有理解錯誤的,後邊再改。。。