webViewDidFinishLoad 執行多次的問題

weixin_30924079發表於2020-04-04

在做網頁載入進度條的時候,發現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...
}

  

 

 

 先這樣吧,如果有理解錯誤的,後邊再改。。。

 

轉載於:https://www.cnblogs.com/yingu/p/5074306.html

相關文章