webViewDidFinishLoad多次调用单次loadrequest

时间:2013-06-07 12:45:41

标签: ios uiwebview

我一直在成功使用webView委托。但最近我遇到了这个代表的奇怪问题。在我目前的项目中,我试图从webview访问我的路由器。我只在URL内传递用户名和密码。下面是加载请求代码。

[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://uname:password@192.168.1.1"]]];

这次调用webView委托方法(webViewDidFinishLoad和webViewDidStartLoad)5次。这是预期的吗?当我通过像google.com这样的简单网址时,它按预期工作。但是使用用户名和密码,为什么这些委托方法会被调用5次?

如果这种行为是正确的,那么我需要知道为什么它只调用了5次。原因是,在我的程序中 - 我在webViewDidFinishLoad方法中调用performSegueWithIdentifier,并且在当前形式中它调用segue 5次。对于解决方法,我可以维护计数,并且仅在第5次计数时调用performSegueWithIdentifier。

由于

3 个答案:

答案 0 :(得分:14)

每个HTML框架调用一次

webViewDidStartLoad/webViewDidFinishLoad。您的内容可能包含多个框架。

请参阅UIWebViewDelegate docs

  

<强> webViewDidStartLoad:   在Web视图开始加载框架后发送。

答案 1 :(得分:6)

本方法适用于我...... :)

#pragma mark UI Web View Delegate
NSInteger webViewLoads;
//a web view starts loading
- (void)webViewDidStartLoad:(UIWebView *)webView{
    webViewLoads++;
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    [SVProgressHUD showWithStatus:@"Loading..." maskType:SVProgressHUDMaskTypeBlack];
}

//web view finishes loading
- (void)webViewDidFinishLoad:(UIWebView *)webView{
    webViewLoads--;
    [self performSelector:@selector(webViewFinishLoadWithCondition) withObject:nil afterDelay:0.5];
}

//web view handling error
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
    webViewLoads--;
        NSLog(@"Web View Did Fail Load With Error : %@",error);
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        [SVProgressHUD dismiss];
}

-(void)webViewFinishLoadWithCondition{
    if(webViewLoads==0){
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        [SVProgressHUD dismiss];
    }
}

答案 2 :(得分:0)

每个HTML框架调用webViewDidStartLoad/webViewDidFinishLoad一次,使用整数查找最后一帧加载完成的时间,

详细说明:

  • 增加webViewDidStartLoad
  • 中的整数
  • 减少webViewDidFinishLoad
  • 中的整数
  • webViewDidFinishLoad检查整数是否为零时,表示网页的所有帧都已加载,现在调用选择器

这是对@marvin的答案的解释

最佳方法:

检查isLoading中的webViewDidFinishLoadisLoading是否为假,做你想做的事

-(void)webViewDidFinishLoad:(UIWebView *)webview  
{
   if (!webview.isLoading)
   {
       // webview is done loading content.

       // `performSegueWithIdentifier` / Your code Here

   }
}