web-dev-qa-db-ja.com

UIWebViewが完全にロードを完了したことを検出する方法は?

UIWebViewのフィルターを作成しようとしていますが、UIWebViewの読み込みが完全に完了すると、検出に苦労しています。私は次の2つの方法を使用しました

– webView:shouldStartLoadWithRequest:navigationType:
– webViewDidFinishLoad:

しかし問題は、ページにフレームと追加のコンテンツをロードするときに、これらが複数回呼び出されることです。

私が必要なのは、ビューが完全に読み込まれ、フェッチするコンテンツがなくなったときを知ることです。次に、コンテンツが読み込まれると、承認されたURLのリストに対してページのURLをチェックできます。

何か案は?

17
ORStudios

UIWebViewDelegateプロトコルメソッドwebViewDidFinishLoadおよびwebView'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");
 }
34
Paresh Navadiya

Swift 3バージョン:

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

元の質問が何年も前に投稿されたことは事実です。最近、私はこの問題に対する信頼できる解決策を見つけなければなりませんでした。

ここに私のために働いた解決策があります:

  1. UIWebViewをWKWebWiewに置き換えました。
  2. 「didFinishNavigation」デリゲートメソッドの処理中に「evaluateJavaScript」コードを追加しました。

完全なコードは次のとおりです。

   - (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);
        }
    }];
}
1
Nish

使用してみてください:

- (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)
{}

お役に立てれば幸いです。

1
Love Thailand

あなたがUIWebViewの所有者ではなく、その結果、webViewDidFinishLoadへのアクセス権はないが、UIWebViewへの参照がある場合、次のコードを使用できます

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

    guard uiWebView.isLoading else {
        return
    }

    timer.invalidate()
    //Add your logic here

}
0
yoAlex5