2012-06-27 8 views
5

Empecé a jugar con UIProgressView en iOS5, pero realmente no he tenido suerte. Tengo problemas para actualizar la vista. Tengo un conjunto de acciones secuenciales, después de cada actualización de progreso. El problema es que la vista de progreso no se actualiza poco a poco, sino solo después de que todos hayan terminado. Es algo parecido a esto:UIProgressView no actualizando?

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

mensajes Navegar por desbordamiento de pila, he encontrado como estos - setProgress is no longer updating UIProgressView since iOS 5, lo que implica el fin para que esto funcione, se necesita para ejecutar un hilo separado.

Me gustaría aclarar esto, ¿realmente necesito hilo separado para que UIProgressView funcione correctamente?

Respuesta

18

Sí, todo el propósito de la vista de progreso es para enhebrar.

Si está ejecutando ese bucle en el hilo principal, está bloqueando la IU. Si bloquea la interfaz de usuario, los usuarios pueden interactuar y la interfaz de usuario no se puede actualizar. Deberías hacer todo el trabajo pesado en el hilo de fondo y actualizar la interfaz de usuario en el hilo principal.

Aquí está una pequeña muestra

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

Definir UIProgressView en .h archivo:

IBOutlet UIProgressView *progress1; 

En .m archivo:

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

tuve un problema similar. UIProgressView no se actualiza aunque me setProgress e incluso intentó setNeedsDisplay, etc.

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

que tenía (int) antes de los avances en parte setProgress. Si llama a setProgress con int, no se actualizará como UISlider. Uno debería llamarlo con valor flotante solo de 0 a 1.

Cuestiones relacionadas