0

私は検索しましたが、これに対する解決策が見つからなかったので、誰かが助けてくれることを願っています.

ユーザーがボタンを押したときに呼び出される UIWebView があります。電話がデータ接続されていないときの動作を説明しない限り、すべてがうまく機能します.

スマートフォンを機内モードまたはデータ接続なしで初めてUIWebView を開こうとすると、次のようになります。

  • UIWebView の読み込みが開始されます
  • 読み込みに失敗する

UIWebView が割り当てられ、初めて読み込みに失敗した場合、IBAction ([webView reload] を呼び出す) にリンクされた更新ボタンを押すと、次のようになります。

  • 初期ロードが失敗した後に電話機にデータ接続があるかどうかに関係なく、refresh IBAction が呼び出されますが、私の NSLogs は、webViewDidStartLoad、webViewDidFinishLoad、webView…didFailLoadWithError のいずれも呼び出されていないことを示しています。

アプリを実行したままデバイスへのデータ接続をオンにした場合 (機内モードをオフにするなど)、アプリに戻って更新ボタンを押すと、[webView reload] が呼び出されますが、webViewDidStartLoad (したがって webViewDidFinishLoad) は呼び出されません。

関連するコードは次のとおりです。

webView を起動するには:

-(IBAction)loadWebView {

    webView = [[UIWebView alloc] init];
    webView.scalesPageToFit = YES;
    [webView setDelegate:self];

    NSString *urlAddress = @"http://google.com";
    NSURL *url = [NSURL URLWithString:urlAddress];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];

    [webView loadRequest:requestObj];

}

リロード:

  -(IBAction)reloadWebView{
    [webView reload];
    NSLog(@"RELOAD");
}

webViewDidStart、DidFinish、didFailLoadWithError:

 - (void)webViewDidStartLoad:(UIWebView *)webView
{  
    NSLog(@"START LOAD");   
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
     NSLog(@"FINISH LOAD");    
}

- (void)webView:(UIWebView *) webView didFailLoadWithError:(NSError *)error 
{ 
       NSLog(@"DID FAIL");
}

考え?

4

2 に答える 2

2

Web ページを読み込む必要があるかどうかを確認する良い方法は、Reachabilityを使用することです。

NetworkStatus currentStatus = [[Reachability reachabilityForInternetConnection] 
                               currentReachabilityStatus];

if(currentStatus == kReachableViaWWAN) // 3G

else if(currentStatus == kReachableViaWifi) // ...wifi

else if(currentStatus == kNotReachable) // no connection currently possible

webView接続が不可能なときにロードを開始しなければ、おそらくこのシナリオを完全に回避できます。

ただし、奇妙な動作の修正: refresh メソッドで、まだ何かがロードされているかどうかを確認し、ロードされていない場合はそこを呼び出しloadRequest:requestObjます。例えば:

- (IBAction)reloadWebView {
    if(webView.request != nil)
        [webView reload];
    else {
        // reconstruct requestObj here, or use a class member
        [webView loadRequest:requestObj];
    }

    NSLog(@"RELOAD");
}
于 2011-09-02T04:57:06.057 に答える