ios uilabel asihttprequest

ios - El texto de UILabel no se actualiza



asihttprequest (4)

No puedo cambiar el texto de UILabel. El código para el UILabel dentro de viewDidLoad es:

startLabel=[[UILabel alloc] initWithFrame:CGRectMake(75, 395, 200, 30)]; startLabel.text=@"Recording Sound ..."; startLabel.backgroundColor=[UIColor clearColor]; startLabel.textColor=[UIColor whiteColor]; startLabel.font=[UIFont boldSystemFontOfSize:17]; [self.view addSubview:startLabel];

Más tarde, si deseo cambiar la etiqueta del texto con el siguiente código, no cambia en la aplicación:

startLabel.text=@"Searching Database ...";

o

[startLabel setText:@"Searching Database ..."];

El UILabel no está vacío, lo imprimí durante la depuración y muestra:

(gdb) po startLabel <UILabel: 0x2c1a30; frame = (75 395; 200 30); text = ''Searching Database ...''; clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x2ae8f0>>

Entonces, el texto de la etiqueta cambia dentro de UILabel, pero no se actualiza en la pantalla.

¿Puede alguien amablemente decirme lo que me falta aquí? Gracias.

Edit 1: Intenté performSelectorOnMainThread: - no funcionó para mí. Edición 2: estoy usando las clases AVFoundation y ASIHTTP para grabar sonido y cargar el archivo grabado aquí. Nada más. No usé ningún hilo.


El mío es un poco más inesperado, aunque razonable, simplemente no es algo por lo que nadie piense demasiado.

Se supone que UILabel actualizar el UILabel cuando recibo una NSNotification que disparé en otro lugar. Sin embargo, la notificación se desencadenó de un hilo de fondo, por lo que incluso los métodos de escucha que actualizan el texto de la etiqueta se disparan en segundo plano.

Si confía en una NSNotification para actualizar la etiqueta, o cualquiera de sus vistas, NSNotification la NSNotification desde la NSNotification de interfaz de usuario principal.


En mi caso, la función que se estaba actualizando se llamó desde un reconocedor táctil en un hilo, pero el lugar en la función donde estoy cambiando el valor de la propiedad de texto de la etiqueta lo volví a colocar en el hilo principal:

dispatch_async(dispatch_get_main_queue(), ^{ [self.someLabel setText:someString]; });


Es posible que enfrente un problema con el enhebrado como se menciona en los comentarios anteriores. Si tiene un método que se ejecuta en el hilo principal y realiza alguna actividad (como buscar en una base de datos), las actualizaciones que realice en la interfaz de usuario no se confirmarán hasta que el ciclo de ejecución obtenga el control. Por lo tanto, si tiene una tarea larga y lenta en el hilo principal, ejecute este código después de configurar el texto de la etiqueta:

- (void)doSomethingTimeConsuming ... consume some time ... ... set text of label ... [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; ... continue long operation ... }

Esto debería eliminar cualquier cambio de UI que hayas realizado. Aunque esto puede ser un truco razonable y funcional, no supera la alternativa. Le sugiero encarecidamente que realice las tareas que consumen tiempo de su aplicación en una performSelectorOnMainThread:withObject:waitUntilDone: fondo y actualice la UI a través del hilo principal utilizando performSelectorOnMainThread:withObject:waitUntilDone: Vea la página de Apple en iOS Thread Management .


Tenía un UILabel que muestra un número de nivel que no se actualizaría al nuevo número de nivel en un UIViewController. La única solución viable que pude encontrar que funcionó fue llamar a setNeedsDisplay en el hilo principal del controlador de vista que poseía el UILabel

-(void)changeLevelLabel:(int)theLevel { dispatch_async(dispatch_get_main_queue(), ^{ self.levelLabel.text = [NSString stringWithFormat:@"%d",theLevel]; [self.levelLabel setNeedsDisplay]; });

}

Consulte http://iosdevelopmentjournal.com/blog/2013/01/16/forcing-things-to-run-on-the-main-thread/ para obtener una explicación más detallada