9

自从 iOS 5 发布以来,我的进度条有点麻烦。下面的代码在 iOS 5 之前运行良好,但在 iOS 5 中,进度条不再显示在循环中设置的新进度。

该代码预计将像这样工作:

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

这是酒吧初始化的代码:

// 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 版本是否有任何可能破坏它的变化?

4

2 回答 2

18

自从iOS 5切换以来,我已经看到很多这样的问题,我不确定为什么只有iOS 5有问题。但主要是因为我不确定为什么之前没有问题。

在您的代码中,您[progressBar setProgress: [counterPercentage floatValue]];从后台线程调用。这是一个 UI 调用,不应从后台线程进行。您也可以调用setNeedsDisplaywhich 不需要更新,progressBar因为 anUIProgressView知道如何显示自己。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
}
于 2012-01-10T13:51:48.077 回答
2

它确实在 iOS 5 中工作,最简单的方法是在这里:

.h 文件:

IBOutlet UIProgressView *WhateverYouWantToCallIt;

.m 文件:

[WhateverYouWantToCallIt setProgress:(float) 0.3];

在它说 0.3 的地方,你可以放任何你喜欢的值(在 0 到 1 之间)

于 2012-11-01T11:00:38.503 回答