自iOS 5以来,setProgress不再更新UIProgressView

fav*_*avo 9 nsnumber uiprogressview ios4 ios5

自iOS 5问世以来,我对进度条有点麻烦.下面的代码在iOS 5之前工作正常但是在iOS 5中,进度条不再显示在循环中设置的新进度.

代码应该像这样工作:

  1. 创建进度条(工作)
  2. 在新的后台进程中:设置0.25的初始进度(工作)
  3. 在相同的后台进程中:通过循环更新进度(在iOS 4中工作)

这是bar init的代码:

// create a progress bar
UIProgressView *progressBar = [[UIProgressView alloc] initWithFrame:CGRectMake(coverSizeX*0.25, coverSizeY - 34.0, coverSizeX*0.5, 9.0)];
progressBar.progress = 0.0;
progressBar.progressViewStyle = UIProgressViewStyleBar;
Run Code Online (Sandbox Code Playgroud)

在另一个线程中,它将进度的起点设置为0.25:

// set an initial progress
[progressBar setProgress: 0.25];
Run Code Online (Sandbox Code Playgroud)

稍后它会在循环中更新进度以显示下载进度:

// within a for-loop:
NSNumber *counterPercentage;
for ( pageDownload = 1; pageDownload < pagesToDownload; pageDownload++ ) {
    counterPercentage = [[NSNumber alloc] initWithFloat: (float)pageDownload / (float)((float)pagesToDownload)];
    [progressBar setProgress: [counterPercentage floatValue]];
    [progressBar performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];
}
Run Code Online (Sandbox Code Playgroud)

...但是屏幕上没有显示进度,进度条卡在设置的初始0.25进度上.

iOS 5版本是否有任何变化可能会破坏它?

NJo*_*nes 18

自iOS 5开关以来,我已经看过很多像这样的问题了,我不知道为什么只有iOS 5才会出现问题.但主要是因为我不确定之前为什么没有问题.

在您的代码中,您[progressBar setProgress: [counterPercentage floatValue]];从后台线程调用.这是一个UI调用,不应该从后台线程进行.你也可以调用setNeedsDisplay哪个更新,progressBar因为UIProgressView知道如何显示自己.iOS 5似乎已经使更新UI的要求更加严格,但仅限于最佳实践.

在我看来,这看起来像块的完美用途.使用块你的for循环可以这样写:

for ( pageDownload = 1; pageDownload < pagesToDownload; pageDownload++ ) {
        // Other stuff in background
    dispatch_async(dispatch_get_main_queue(), ^{
        progressBar.progress = ((float)pageDownload/(float)pagesToDownload);
    });
        // Other stuff in backgroud
}
Run Code Online (Sandbox Code Playgroud)