如何在加载UIWebView时使用UIProgressView?

时间:2009-12-14 10:39:04

标签: iphone uiprogressview

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

但是现在我正在尝试在加载过程中显示UIProgressView(从0.0开始到1.0),随着加载的进度而动态更改。

我该怎么做?

3 个答案:

答案 0 :(得分:22)

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

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

两个警告:

  1. NSURLResponse的expectedContentLength属性可能是 -1 NSURLReponseUnknownLength常量)。在这种情况下,我建议你在connection:didFinishLoading内关闭一个标准的UIActivityIndi​​cator。

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

  3. 使用这种技术,当你知道你应该获得多少数据时,你可以显示一个进度条,当你不知道时,你可以显示一个微调器。

答案 1 :(得分:2)

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

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

答案 2 :(得分:-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
  

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