如何检测UIWebView何时完全加载?

时间:2014-08-22 11:00:01

标签: ios objective-c uiwebview uiwebviewdelegate

我正在尝试为UIWebView构建一个过滤器,我正在努力检测UIWebView何时完全加载。我使用了以下两种方法

– webView:shouldStartLoadWithRequest:navigationType:
– webViewDidFinishLoad:

但问题是,当页面包含要加载的帧和其他内容时,会多次调用这些内容。

我需要的是知道视图何时完全加载并且没有更多内容可以获取。然后,当内容加载后,我可以根据已批准的URL列表检查页面的URL。

任何想法?

5 个答案:

答案 0 :(得分:34)

使用UIWebViewDelegate协议方法webViewDidFinishLoadwebView's isLoading property

 - (void)webViewDidFinishLoad:(UIWebView *)webView
 {
    //Check here if still webview is loding the content
    if (webView.isLoading)
       return;

    //after code when webview finishes
    NSLog(@"Webview loding finished");
 }

答案 1 :(得分:2)

Swift 3版本:

func webViewDidFinishLoad(_ webView: UIWebView) {
    if webView.isLoading{
        return
    }
    print("Done loading")
}

答案 2 :(得分:1)

尝试使用:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)requestURL navigationType:(UIWebViewNavigationType)navigationType {
NSURL *url = [requestURL URL];
NSLog(@"##### url = %@",[url absoluteString]); 
return YES;
}

不要忘记设置您的UIWebView代理

或添加声明,

NSRange range = [[url absoluteString] rangeOfString:@"https://www.google.com"];
if (range.location != NSNotFound)
{}
希望能帮到你。

答案 3 :(得分:1)

原始问题确实是多年前发布的。最近我不得不为这个问题找到一个可靠的解决方案。

以下是适合我的解决方案:

  1. 用WKWebWiew替换了UIWebView。
  2. 在处理'didFinishNavigation'委托方法时添加了'evaluateJavaScript'代码。
  3. 完整的代码是:

       - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{
        [webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id result, NSError *error) {
            if (result != nil) {
                // Call your method here
            }
            if(error) {
                NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
            }
        }];
    }
    

答案 4 :(得分:0)

如果您不是UIWebView的所有者,因此您无权访问webViewDidFinishLoad,但是您引用了UIWebView,则可以使用下一个代码

Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in

    guard uiWebView.isLoading else {
        return
    }

    timer.invalidate()
    //Add your logic here

}