11

我正在开发一个应用程序,我在 UIWebView 中加载一个 urlrequest 并且它成功发生了。

但是现在我试图在加载过程中显示一个 UIProgressView(从 0.0 到 1.0),它会随着加载的进度而动态变化。

我怎样才能做到这一点?

4

3 回答 3

22

UIWebView 在正常模式下不会为您提供任何进度信息。您需要做的是首先使用 NSURLConnection 异步获取数据。当 NSURLConnection 委托方法connection:didReceiveResponse时,您将获取从中获得的数字expectedContentLength并将其用作最大值。然后,在委托方法connection:didReceiveData中,您将使用lengthNSData 实例的属性来告诉您已经走了多远,因此您的进度分数将被length / maxLength标准化为 0.0 和 1.0 之间。

最后,您将使用数据而不是 URL(在您的connection:didFinishLoading委托方法中)初始化 webview。

两个警告:

  1. expectedContentLengthNSURLResponse的属性可能是-1NSURLReponseUnknownLength常量)。在这种情况下,我建议抛出一个标准的 UIActivityIndi​​cator ,你可以在里面关闭它connection:didFinishLoading

  2. 确保任何时候您从 NSURLConnection 委托方法之一操作可见控件时,您都通过调用来执行此操作performSelectorOnMainThread:- 否则您将开始收到可怕的 EXC_BAD_ACCESS 错误。

使用这种技术,您可以在知道应该获取多少数据时显示进度条,在您不知道时显示微调器。

于 2009-12-15T13:39:36.907 回答
2

您可以尝试使用 UIWebView 的这个子类,它使用私有 UIWebView 方法 - 因此,这个解决方案不是 100% AppStore 安全的(尽管有些应用程序几乎 100% 使用它:Facebook、Google 应用程序......)。

https://github.com/petr-inmite/imtwebview

于 2011-11-23T20:17:03.223 回答
-2

使用 NSURLConnection 两次获取相同的数据,浪费时间,因为它会减慢用户交互它两次加载数据,消耗互联网数据。最好基于计时器进行 uiprogress,当 webview 成功加载网页时将显示 uiprogress 加载。在这种情况下,您可以在每次加载网页时显示动态 uiprogress.. 不要忘记创建一个 uiprogress 视图并将其命名为 myProgressview 并将其设置在文件所有者中。

这是代码希望它有所帮助

@synthesize myProgressView;
- (void)updateProgress:(NSTimer *)sender
{      //if the progress view is = 100% the progress stop
    if(myProgressView.progress==1.0)
    {
        [timer invalidate]; 
    }
   else
         //if the progress view is< 100% the progress increases
       myProgressView.progress+=0.5;
}
- (void)viewDidLoad
{ //this is the code used in order to load the site
    [super viewDidLoad];
    NSString *urlAddress = @"http://www.playbuzz.org/";
    myWebview.delegate = self;
   [myWebview loadRequest:[NSURLRequest requestWithURL:[NSURL     URLWithString:urlAddress]]];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{    ///timer for the progress view

 timer=[[NSTimer scheduledTimerWithTimeInterval:0.1
                          target:self
                          selector:@selector(updateProgress:)
                          userInfo:myProgressView
                          repeats:YES]retain];

}

- (void)dealloc {
    [myProgressView release];
    [super dealloc];
}
@end

这个代码和想法真的帮助我解决了我的问题。

于 2013-10-04T04:38:55.853 回答