web-dev-qa-db-ja.com

UIWebViewがロードされているかどうかを確認します

ViewDidLoadに読み込まれるUIWebViewが1つのタブにありますが、ユーザーが他のタブをタップすると読み込みが中断され、- (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];
        }

    }

しかし、それは機能していません、助けてください?

18
vburojevic

UIWebviewには、webViewDidFinishLoadデリゲートメソッドがあります。これが行われたことを示すためにブール値を設定します。

- (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;

}
28
Zigglzworth

まだ機能していない場合は、次の例を使用してください。また、ロードに失敗するとアラートが表示され、アラートは1回だけ表示されます。

ヘッダ:

@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;
    }
}

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

8
matsr

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

これが私のために働いた解決策です:

  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

複数のフレームがあるページの場合は、UIWebView.loadingプロパティも使用する必要があります。

Appleのドキュメント:@property(nonatomic、readonly、getter = isLoading)BOOLloadingレシーバーがコンテンツのロードを完了したかどうかを示すブール値。

はいの場合、受信者はまだコンテンツをロードしています。それ以外の場合は、いいえ。

IOS6(ベータ4)では、Appleはこのプロパティに関するいくつかの問題も修正しました。 http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading -in-ios-6-fixed.html

0
Mazed