UIProgressView没有显示

时间:2013-08-27 03:59:03

标签: ios objective-c uiprogressview

我有一个从服务器下载图片的应用。我想向用户展示进展情况。我已经阅读了关于苹果文档的UIProgressView,并在这个网站上阅读了很多答案,但我无法让它工作。这是我的代码 在我的viewDidLoad我有

_profileProgressView.hidden= YES;
_profileProgressView.progress = 0.0;

在我的- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response中,我显示了UIProgressView,然后获得了预期的图像大小。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
      self.profileProgressView.hidden= NO;
      [self.remote_response setLength:0];
      received = 0;
      self.filesize = [NSNumber numberWithLongLong:[response expectedContentLength]];
      NSLog(@"Content Length::%@", self.filesize);
  }

在我的- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d中,我计算下载图像的百分比,然后更新UIProgressView的进度并记录下载进度。

 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d {
        [self.remote_response appendData:d];

        NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[self.remote_response length]];
        dispatch_async( dispatch_get_main_queue(), ^ {
              float progress = (_profileProgressView.progress + ([self.filesize floatValue]/[resourceLength floatValue])*100);
              [self.profileProgressView setProgress:progress animated:YES];
              NSLog(@"Downloading %.0f%% complete", _profileProgressView.progress);
        });
   }

当我运行此代码时

  1. UIProgressView永远不会显示

  2. 我得到的日志是Downloading 0% complete。我希望得到正在下载的图像的日志。

  3. 此外我还以为allocinit viewDidDownload中的UIProgressView,当我这样做时,我得到UIProgressView,但它没有显示进度,并且它不会隐藏图像已下载完毕。

2 个答案:

答案 0 :(得分:1)

我认为你使用NSNumber对数学类型的装箱和拆箱进行数学复杂化。

我要做的是创建三个变量:

double fileLength;
double lastProgress;
double currentLength;

然后做简单的数学运算:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
  fileLength = [response expectedContentLength];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d {
  double length = [d length];
  currentLength += length;
  double progress = currentLength/fileLength;

  if (lastProgress < progress) {
    profileProgressView.progress = progress;
    lastProgress = progress;
  }
}

答案 1 :(得分:0)

之前我也经历过同样的问题。在这种情况下,我们无法显示准确的进度视图。为了显示准确的进度,您的服务器应提供响应头中发送的字节。然后,你可以在你的连接中获得确切的数据:didReceiveData:delegate。否则,你会立即得到1.0。

即使您希望在没有服务器依赖性的情况下显示进度视图,也可以通过将数据长度分成n个步骤并使用NSTimer来进行处理来实现。