Ios UIProgressView是否未更新?
我已经开始在iOS5中使用UIProgressView,但还没有真正使用它。更新视图时遇到问题。每次更新进度后,我都有一组连续的操作。问题是,进度视图并不是一点一点地更新,而是在全部完成之后才更新。事情是这样的:Ios UIProgressView是否未更新?,ios,multithreading,ios5,uiprogressview,Ios,Multithreading,Ios5,Uiprogressview,我已经开始在iOS5中使用UIProgressView,但还没有真正使用它。更新视图时遇到问题。每次更新进度后,我都有一组连续的操作。问题是,进度视图并不是一点一点地更新,而是在全部完成之后才更新。事情是这样的: float cnt = 0.2; for (Photo *photo in [Photo photos]) { [photos addObject:[photo createJSON]]; [progressBar setProgress:cnt animated:YE
float cnt = 0.2;
for (Photo *photo in [Photo photos]) {
[photos addObject:[photo createJSON]];
[progressBar setProgress:cnt animated:YES];
cnt += 0.2;
}
浏览stack overflow时,我发现了这样的帖子-,这意味着为了让它工作,我需要运行一个单独的线程
我想澄清这一点,UIProgressView是否真的需要单独的线程才能正常工作?是的,ProgressView的整个目的就是为了线程 如果在主线程上运行该循环,则会阻塞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];
}
-(void)viewDidLoad
{
[超级视图下载];
[self-performSelectorInBackground:@selector(backgroundProcess),对象:nil];
}
-(无效)背景过程
{
对于(int i=0;i<500;i++){
//做工作。。。
//更新用户界面
[self-performSelectorOnMainThread:@selector(setLoaderProgress:)with对象:[NSNumber numberWithFloat:i/500.0]waitUntilDone:NO];
}
}
-(无效)setLoaderProgress:(NSNumber*)编号
{
[progressView setProgress:number.floatValue动画:是];
}
在.h
文件中定义UIProgressView
:
IBOutlet UIProgressView *progress1;
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++;
}
在.m
文件中:
IBOutlet UIProgressView *progress1;
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++;
}
我也有类似的问题。UIProgressView没有更新,尽管我做了setProgress,甚至尝试了setNeedsDisplay等
float progress = (float)currentPlaybackTime / (float)totalPlaybackTime;
[self.progressView setProgress:progress animated:YES];
在setProgress部分的进度之前,我有(int)。如果使用int调用setProgress,它将不会像UISlider那样更新。应该仅使用0到1之间的浮点值来调用它