Botón IOSHaz clic y actualizar una vista

En un método buttonClicked, quiero establecer el color del text en una UILabel en negro, esperar tres segundos y luego establecer el color en verde. Sin embargo, la label nunca se vuelve negra. El método espera tres segundos, luego el text UILabel se vuelve verde. Pensé que usar performSelectorOnMainThread resolvería este problema, pero no lo ha hecho. El código está debajo. Muchas gracias de antemano, y disculpas si me falta algo obvio.

Jon R.

-(void) buttonClicked: (id) sender { // (UILabel *) letterLabel is instance variable of TestProgramDelegate [letterlabel performSelectorOnMainThread:@selector(setTextColor:) withObject:[UIColor blackColor] waitUntilDone:YES]; [NSThread sleepForTimeInterval:3]; [letterLabel performSelectorOnMainThread:@selector(setTextColor:) withObject: [UIColor greenColor] waitUntilDone:YES]; } 

Su método cambia el color sincrónicamente dos veces. Todo ese código se ejecuta en el hilo principal.

 // run on main thread [letterlabel performSelectorOnMainThread:@selector(setTextColor:) withObject:[UIColor blackColor] waitUntilDone:YES]; // buttonClicked: called on mainThread so this is on main thread [NSThread sleepForTimeInterval:3]; // also on main thread ... [letterLabel performSelectorOnMainThread:@selector(setTextColor:) withObject: [UIColor greenColor] waitUntilDone:YES]; 

El subprocess principal de la interfaz de usuario está dando vueltas y buscando un código para disparar basado en cosas como clics de button. Una vez que se detecta el clic, su método se ejecuta, establece el color, espera tres segundos y luego establece el color nuevamente antes de que el bucle principal de la UI pueda volver a dibujarse. Como la interfaz de usuario no se vuelve a dibujar en el medio, nunca se ve el primero.

Si desea hacer eso, deberá configurar el color en un hilo de background, esperar tres segundos y volver a llamar al hilo principal para actualizar la interfaz de usuario.

Esta es una publicación relacionada:

GCD, subprocesss, flujo de progtwigs y actualización de UI

El - (void)buttonClicked:(id)sender será llamado en el hilo principal por lo que es confuso por qué está utilizando [letterlabel performSelectorOnMainThread:@selector(setTextColor:) withObject:[UIColor blackColor] waitUntilDone:YES]; cuando el context ya es el hilo principal.

[letterlabel setBackgroundColor:[UIColor blackColor]]; debe ser todo lo que necesita llamar cuando se presiona el button.

Puede usar un NSTimer o callback de notificación local para cambiar el color a verde. Por lo general, no es una buena idea poner el hilo principal a dormir en su aplicación.

¡Espero que ayude!