2011-10-05 24 views
16

私はviewDidLoadでロードする1つのタブにUIWebViewを持っていますが、ユーザーが他のタブをタップするとロードが中断され、 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)errorが呼び出されますが、ユーザーが再び前のタブをタップし、それがロードされていない場合には、このUIWebViewがロードされていることを確認する

-(void)viewWillAppear:(BOOL)animated 
{ 
    if (!webView) 
     { 
      NSURL *url = [NSURL URLWithString:@"url"]; 
      NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
      [webView loadRequest:request]; 
     } 

    } 

のようなものを、それをリロードします。しかし、それは働いていない場合は、助けてください?

+0

OK働く唯一の解決策(私が見つけた):http://stackoverflow.com/questions/1662565/uiwebview-finished-loading-event/25620001# 25620001 – sabiland

答えて

27

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; 

} 
+0

not working ...:/ – vburojevic

+0

どちらの部分が機能していませんか?デリゲートメソッドが呼び出されていますか? – Zigglzworth

+0

はい、問題は、読み込みに失敗した後にwebviewdidfinishloadが呼び出されるため、boolは常にYESになります – vburojevic

8

まだ動作していない場合は、ここに動作例があります。また、読み込みに失敗するとアラートが表示され、アラートは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; 
    } 
} 

私はそれが役に立てば幸い。

0

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

アップルのドキュメント:@property(nonatomic、readonly、getter = isLoading)BOOL読み込み 受信者がコンテンツの読み込みを完了したかどうかを示すブール値。

はいの場合、受信者はまだコンテンツをロードしています。そうでなければNO。

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

1

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

  1. :ここ

    は私のために働いたソリューションです。

  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); 
     } 
    }]; 
} 
関連する問題