2012-06-27 52 views
5

我已经开始在iOS5中玩UIProgressView,但并没有真正运气。我在更新视图时遇到问题。每次更新进度后,我都有一系列顺序操作。问题是,进度视图不是一点一点地更新,而只是在完成之后才进行。它是这样的: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正常工作吗?

回答

18

是的,进度视图的全部目的是针对线程。

如果您在主线程上运行该循环,则会阻止用户界面。如果您阻止用户界面,则用户可以进行交互,并且用户界面无法更新。 YOu应该对后台线程执行所有繁重的操作,并更新主线程上的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]; 
} 
2

.h文件定义UIProgressView

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++; 

} 
1

我有类似的问题。 UIProgressView不更新虽然我没有setProgress,甚至试图setNeedsDisplay等

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

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