UIWebViewのフィルターを作成しようとしていますが、UIWebViewの読み込みが完全に完了すると、検出に苦労しています。私は次の2つの方法を使用しました
– webView:shouldStartLoadWithRequest:navigationType:
– webViewDidFinishLoad:
しかし問題は、ページにフレームと追加のコンテンツをロードするときに、これらが複数回呼び出されることです。
私が必要なのは、ビューが完全に読み込まれ、フェッチするコンテンツがなくなったときを知ることです。次に、コンテンツが読み込まれると、承認されたURLのリストに対してページのURLをチェックできます。
何か案は?
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");
}
Swift 3バージョン:
func webViewDidFinishLoad(_ webView: UIWebView) {
if webView.isLoading{
return
}
print("Done loading")
}
元の質問が何年も前に投稿されたことは事実です。最近、私はこの問題に対する信頼できる解決策を見つけなければなりませんでした。
ここに私のために働いた解決策があります:
完全なコードは次のとおりです。
- (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);
}
}];
}
使用してみてください:
- (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)
{}
お役に立てれば幸いです。
あなたがUIWebView
の所有者ではなく、その結果、webViewDidFinishLoad
へのアクセス権はないが、UIWebView
への参照がある場合、次のコードを使用できます
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in
guard uiWebView.isLoading else {
return
}
timer.invalidate()
//Add your logic here
}