Проверьте, загружен ли UIWebView
У меня есть UIWebView на одной вкладке, которая загружается в viewDidLoad, но если пользователь удаляет другую вкладку, загрузка будет нарушена и - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
будет вызван, но я хочу знать, как можно проверить, загружен ли webView, если пользователь снова нажал предыдущую вкладку, и если он не загружен, он перезагрузит его, что-то вроде этого
-(void)viewWillAppear:(BOOL)animated
{
if (!webView)
{
NSURL *url = [NSURL URLWithString:@"url"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
}
}
Но он не работает, пожалуйста, помогите?
Ответы
Ответ 1
UIWebview имеет метод делегирования webViewDidFinishLoad. Установите bool, чтобы указать, что это было сделано.
- (void)webViewDidStartLoad:(UIWebView *)webView {
webViewDidFinishLoadBool = NO;
loadFailedBool = NO;
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
loadFailedBool = YES;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
if (!loadFailedBool)
webViewDidFinishLoadBool = YES;
}
Ответ 2
Если у вас еще нет работы, вот рабочий пример. Он также показывает предупреждение при невозможности загрузить, а предупреждение отображается только один раз.
Заголовок:
@interface MyViewController : UIViewController <UIWebViewDelegate> {
BOOL wasLoaded;
BOOL alertWasShown;
}
@property (nonatomic, retain) IBOutlet UIWebView *myWebView;
@end
Реализация:
- (void)loadWebView:(NSString *)urlString {
if (wasLoaded == NO) {
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *requestObject = [NSURLRequest requestWithURL:url];
[myWebView loadRequest:requestObject];
}
}
- (void)viewWillAppear:(BOOL)animated {
NSString *urlString = @"put your url here";
[self loadWebView:urlString];
}
- (void)viewDidLoad {
[super viewDidLoad];
wasLoaded = NO;
alertWasShown = NO;
myWebView.delegate = self;
}
- (void)webViewDidStartLoad:(UIWebView *)webView {
// Not necessary to do anything here.
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
wasLoaded = YES; // Indicates that it finished loading.
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
if (alertWasShown == NO) {
UIAlertView *alert = ... // Create an alert.
[alert show];
alertWasShown = YES;
}
}
Я надеюсь, что это поможет.
Ответ 3
Для страниц с несколькими фреймами также следует использовать свойство UIWebView.loading.
Apple doc: @property (nonatomic, readonly, getter = isLoading) Загрузка BOOL
Логическое значение, указывающее, будет ли получатель загружать контент.
Если ДА, приемник по-прежнему загружает контент; в противном случае NO.
В iOS6 (бета-версия 4) похоже, что Apple также исправила некоторые проблемы с этим свойством. http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html
Ответ 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);
}
}];
}