UIProgressView没有更新?

时间:2012-06-27 12:43:47

标签: ios multithreading ios5 uiprogressview

我已经开始在iOS5中使用UIProgressView,但还没有真正的运气。我无法更新视图。在每次更新进度后,我都有一系列顺序操作。问题是,进度视图不是一点一点地更新,而是仅在完成后才更新。它是这样的:

float cnt = 0.2;
for (Photo *photo in [Photo photos]) {
    [photos addObject:[photo createJSON]];
    [progressBar setProgress:cnt animated:YES];
    cnt += 0.2;
}

浏览堆栈溢出,我发现了这些帖子 - setProgress is no longer updating UIProgressView since iOS 5,暗示为了使其工作,我需要运行一个单独的线程。

我想澄清一点,我真的需要单独的线程让UIProgressView正常工作吗?

3 个答案:

答案 0 :(得分:18)

是的,进度视图的整个目的是用于线程化。

如果您在主线程上运行该循环,则会阻止UI。如果您阻止UI,则用户可以进行交互,并且UI无法更新。你应该在后台线程上做所有繁重的工作并更新主线程上的UI。

下载一点样本

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self performSelectorInBackground:@selector(backgroundProcess) withObject:nil];

}

- (void)backgroundProcess
{    
    for (int i = 0; i < 500; i++) {
        // Do Work...

        // Update UI
        [self performSelectorOnMainThread:@selector(setLoaderProgress:) withObject:[NSNumber numberWithFloat:i/500.0] waitUntilDone:NO];
    }
}

- (void)setLoaderProgress:(NSNumber *)number
{
    [progressView setProgress:number.floatValue animated:YES];
}

答案 1 :(得分:2)

UIProgressView文件中定义.h

IBOutlet UIProgressView *progress1;

.m档案中:

test=1.0;
progress1.progress = 0.0;
[self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO];

- (void)makeMyProgressBarMoving {
    NSLog(@"test    %f",test);
    float actual = [progress1 progress];
    NSLog(@"actual  %f",actual);

    if (progress1.progress >1.0){
        progress1.progress = 0.0;
        test=0.0;
    }

    NSLog(@"progress1.progress        %f",progress1.progress);
    lbl4.text=[NSString stringWithFormat:@" %i %%",(int)((progress1.progress) * 100)  ] ;
    progress1.progress = test/100.00;//actual + ((float)recievedData/(float)xpectedTotalSize);
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(makeMyProgressBarMoving) userInfo:nil repeats:NO];
    test++;

}

答案 2 :(得分:1)

我有类似的问题。 UIProgressView没有更新,虽然我做了setProgress甚至尝试过setNeedsDisplay等。

float progress = (float)currentPlaybackTime / (float)totalPlaybackTime;
[self.progressView setProgress:progress animated:YES];

我在setProgress部分进展之前有(int)。如果使用int调用setProgress,它将不会像UISlider那样更新。应该使用浮点值从0到1调用它。