Проверьте, загружен ли 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);
        }
    }];
}