2012-06-27 26 views
5

Ich habe angefangen mit UIProgressView in iOS5 zu spielen, hatte aber nicht wirklich Glück damit. Ich habe Probleme beim Aktualisieren der Ansicht. Ich habe eine Reihe von sequentiellen Aktionen, nach jedem Update Fortschritt. Das Problem ist, dass die Fortschrittsansicht nicht nach und nach aktualisiert wird, sondern erst nachdem alle fertig sind. Es geht ungefähr so:UIProgressView wird nicht aktualisiert?

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

Browsing Stack-Überlauf, ich habe festgestellt, Beiträge wie diese - setProgress is no longer updating UIProgressView since iOS 5, was impliziert, damit dies funktioniert, muss ich einen eigenen Thread laufen.

Ich möchte dies verdeutlichen, brauche ich wirklich separaten Thread für UIProgressView ordnungsgemäß zu arbeiten?

Antwort

18

Ja, der gesamte Zweck der Fortschrittsanzeige ist für Threading.

Wenn Sie diese Schleife im Hauptthread ausführen, blockieren Sie die Benutzeroberfläche. Wenn Sie die Benutzeroberfläche blockieren, können Benutzer interagieren und die Benutzeroberfläche kann nicht aktualisiert werden. Sie sollten alle schweren Aufgaben im Hintergrundthread erledigen und die Benutzeroberfläche im Hauptthread aktualisieren.

Heres ein wenig Probe

- (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

definieren UIProgressView in .h Datei:

IBOutlet UIProgressView *progress1; 

In .m Datei:

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

Ich hatte ähnliches Problem. UIProgressView wurde nicht aktualisiert, obwohl ich setProgress tat und versuchte sogar setNeedsDisplay usw.

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

Ich hatte (int), bevor Fortschritte in setProgress Teil. Wenn Sie setProgress mit int aufrufen, wird es nicht wie UISlider aktualisiert. Man sollte es mit Float-Wert nur von 0 bis 1 nennen.