我已经开始在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正常工作吗?
答案 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调用它。