Как определить, когда UIWebView полностью завершил загрузку?
Я пытаюсь создать фильтр для UIWebView, и я боюсь обнаружить, когда UIWebView полностью завершил загрузку. Я использовал следующие два метода
– webView:shouldStartLoadWithRequest:navigationType:
– webViewDidFinishLoad:
но проблема в том, что они будут вызываться несколько раз, когда на странице есть кадры и дополнительный контент для загрузки.
Мне нужно знать, когда представление полностью загружено, и больше нет содержимого для извлечения. Затем, когда содержимое загружено, я могу проверить URL-адрес страницы по списку утвержденных URL-адресов.
Есть идеи?
Ответы
Ответ 1
Использовать метод протокола UIWebViewDelegate
webViewDidFinishLoad
и webView 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");
}
Ответ 2
Версия Swift 3:
func webViewDidFinishLoad(_ webView: UIWebView) {
if webView.isLoading{
return
}
print("Done loading")
}
Ответ 3
Попробуйте использовать:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)requestURL navigationType:(UIWebViewNavigationType)navigationType {
NSURL *url = [requestURL URL];
NSLog(@"##### url = %@",[url absoluteString]);
return YES;
}
не забудьте установить свой UIWebView Delegate
или добавить выражение,
NSRange range = [[url absoluteString] rangeOfString:@"https://www.google.com"];
if (range.location != NSNotFound)
{}
надеюсь помочь вам.
Ответ 4
Это правда, что исходный вопрос был опубликован много лет назад. Недавно мне пришлось найти надежное решение этой проблемы.
Вот решение, которое сработало для меня:
- Заменен UIWebView с помощью WKWebWiew.
- Добавлен код "valuJavaScript" при обработке метода делегирования "didFinishNavigation".
Полный код:
- (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);
}
}];
}
Ответ 5
Если вы не являетесь владельцем UIWebView
и в результате у вас нет доступа к webViewDidFinishLoad
но у вас есть ссылка на UIWebView
вы можете использовать следующий код
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in
guard uiWebView.isLoading else {
return
}
timer.invalidate()
//Add your logic here
}