6

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

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

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

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

谢谢

4

3 回答 3

15

webViewDidStartLoad/webViewDidFinishLoad每个 HTML 框架调用一次。您的内容中可能有多个框架。

请参阅UIWebViewDelegate 文档

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

于 2013-06-07T22:24:54.070 回答
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];
    }
}
于 2014-05-14T03:38:47.683 回答
0

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

详细地 :

  • 增加整数webViewDidStartLoad
  • 递减整数webViewDidFinishLoad
  • webViewDidFinishLoad整数为零时检查,这意味着网页的所有框架都已加载,现在调用选择器

这是@marvin回答的解释



最佳方法:

签到isLoading是假的webViewDidFinishLoadisLoading做你想做的

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

       // `performSegueWithIdentifier` / Your code Here

   }
}
于 2016-12-20T07:10:47.540 回答