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

时间:2012-01-10 12:22:07

标签: ios4 ios5 nsnumber uiprogressview

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

代码应该像这样工作:

  1. 创建进度条(正常)
  2. 在新的后台流程中:设置0.25(工作)的初始进度
  3. 在相同的后台进程中:通过循环(在iOS 4中工作)更新进度
  4. 以下是条形码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;
    

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

    // set an initial progress
    [progressBar setProgress: 0.25];
    

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

    // 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];
    }
    

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

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

2 个答案:

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

答案 1 :(得分:2)

它在iOS 5中运行,最简单的方法是:

.h文件:

IBOutlet UIProgressView *WhateverYouWantToCallIt;

.m文件:

[WhateverYouWantToCallIt setProgress:(float) 0.3];

如果它说0.3,你可以放任何你喜欢的值(在0到1之内)