Comandos de interfaz de usuario omitidos en IBAction

Aquí está mi código:

-(IBAction)saveDownloadedImage { NSLog(@"Test"); EXECUTED indicatorView.hidden = NO; NOT EXECUTED [indicatorView startAnimating]; NOT EXECUTED [statusLabel setText:@"WHY?"]; NOT EXECUTED [currentPicture setImage:[imageView image]]; EXECUTED ImageFileManager *fileManager = [[ImageFileManager alloc] init]; EXECUTED [fileManager saveImageToDisk:currentPicture]; EXECUTED indicatorView.hidden = YES; [statusLabel setText:@"Image saved successfully."]; EXECUTED saveButton.enabled = NO; EXECUTED 

}

El process de save toma unos 5 segundos. Por lo tanto, sería normal ver el indicador en la interfaz de usuario. ¡Pero nada pasa! ¿Alguna idea?

Todo se ejecuta. Su problema es que la llamada saveImageToDisk es síncrona y la está llamando desde el subprocess de la interfaz de usuario. Cuando bloquea el subprocess de UI, nunca se repinta nada. Se muestra el indicador pero no se puede dibujar en la pantalla hasta que regrese IBAction cuando se haya ocultado nuevamente.

Tiene que llamar al método de guardado de forma asíncrona.
Bloquear el subprocess de UI nunca es una buena idea.

Editar: vea la respuesta para la siguiente pregunta para la solución correcta: llamadas asíncronas a la database en ios

Edit2: una de las posibles soluciones (no probadas)

 -(IBAction)saveDownloadedImage { indicatorView.hidden = NO; //Note you can use hidesWhenStopped property for this [indicatorView startAnimating]; [statusLabel setText:@"BECAUSE..."]; [currentPicture setImage:[imageView image]]; [NSThread detachNewThreadSelector:@selector(save) toTarget:self withObject:nil] } - (void)save { @autoreleasepool { ImageFileManager *fileManager = [[ImageFileManager alloc] init]; [fileManager saveImageToDisk:currentPicture]; [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO]; } } - (void)updateUI { indicatorView.hidden = YES; [statusLabel setText:@"Image saved successfully."]; saveButton.enabled = NO; } 

Estás seguro que

1) indicatorView y statusLabel no son nulos y

2) indicatorView y statusLabel se agregan como subvenciones a self.view?

En Mi percepción, estás comenzando el hilo principal del indicador de actividad.

En su lugar Mostrando el indicador en el hilo principal

debe llamar a Indicador en un hilo separado como a continuación.

 -(IBAction)saveDownloadedImage { NSLog(@"Test"); EXECUTED commented below code //indicatorView.hidden = NO; NOT EXECUTED // [indicatorView startAnimating]; NOT EXECUTED //instead of main thread create new Thread as Below [NSThread detachNewThreadSelector:@selector(showloader) toTarget:self withObject:nil]; [statusLabel setText:@"WHY?"]; NOT EXECUTED [currentPicture setImage:[imageView image]]; EXECUTED ImageFileManager *fileManager = [[ImageFileManager alloc] init]; EXECUTED [fileManager saveImageToDisk:currentPicture]; EXECUTED [statusLabel setText:@"Image saved successfully."]; EXECUTED saveButton.enabled = NO; [indicatorView stopAnimating:YES]; indicatorView.hidden = YES; } //Custome method For shoing the Indicator. -(void)showloader{ //call below method here indicatorView object created already. [indicatorView startAnimating] } It'll definitely work 

Debe declarar su método con un remitente como este

 -(IBAction)saveDownloadedImage:(id)sender