0

我已经搜索并没有找到解决方案,所以希望有人可以提供帮助。

我有一个 UIWebView ,当用户按下按钮时会调用它。一切都很好,除非您考虑手机没有数据连接时的行为。

一次尝试在手机处于飞行模式或没有数据连接的情况下打开 UIWebView 时:

  • UIWebView 开始加载
  • 加载失败

一旦分配了 UIWebView 并且第一次加载失败,点击链接到 IBAction(调用 [webView reload])的刷新按钮会导致:

  • 不管手机在初始加载失败后是否有数据连接,都会调用刷新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

检查您是否应该尝试加载网页的一个好方法是使用Reachability

NetworkStatus currentStatus = [[Reachability reachabilityForInternetConnection] 
                               currentReachabilityStatus];

if(currentStatus == kReachableViaWWAN) // 3G

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

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

如果您webView在无法连接时甚至不开始加载,您可能完全可以避免这种情况。

但是,对奇怪行为的修复:在您的刷新方法中尝试检查它是否已经加载了任何东西,如果没有,则调用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 回答
1

我确实遇到了同样的问题

  1. 第一次打开我UIWebView的手机在飞行模式或者没有数据连接的情况下,依次调用以下方法:
    • -webView:shouldStartLoadWithRequest:navigationType:
    • -webViewDidStartLoad:
    • -webView:didFailLoadWithError
  2. 然后,我点击了刷新按钮,也就是说,我调用了UIWebView's-reload方法,没有调用委托方法,所以我什至无法得到超时通知。

我的解决方案是:

  • 在加载或重新加载请求之前检查网络可达性状态,非常感谢@darvids0n的好建议(但我发现在请求第一次失败后重新加载时request不是)。nil
  • 用于loadRequest:重新加载当前 URL 而不是reload.
  • 实现我自己的超时机制,比如reload/load请求后20s,如果没有调用委托方法,我把它当作超时,取消请求和loadingHUD动画。

其他一些类似的问题

于 2017-05-27T10:27:23.577 回答