2010-04-27 22 views
9

Disculpe la pregunta básica, pero esto me molesta desde hace un tiempo.UILabel no está actualizando

creo una vista de detalles de un uitable y tratan de establecer dinámicamente sus etiquetas, pero no están actualizando: se establecen

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    myObject *tmpObj = [[myObject objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 

    myViewController *tmpVC = [[myViewController alloc] initWithNibName:@"NIBfile" bundle:nil]; 

    [tmpVC.myLabel setText:tmpObj.myTitle]; // The debugger shows the text: myTitle = "myText" 
    NSLog(@"%@", tmpVC.myLabel);    // NSLog SHOWS NULL 

    [self.navigationController pushViewController:tmpVC animated:YES]; 
    [tmpObj release]; 
} 

las conexiones en el Interface Builder. La pestaña de Conexiones para el propietario del archivo muestra

'myLabel' - 'Label (myLabel)' 

¿Alguna idea de por qué no se obtiene el valor?

Unos cuantos Observaciones:

  • También he conectado un IBAction. Este método se llama correctamente cuando I haga clic en el botón conectado.
  • Obtuve algunos consejos para mi declaración NSLog , si eso debería no mejor uso tmpVC.myLabel.text, pero al intentar también devuelve NULL.
  • myLabel se declara como IBOutlet UILabel * myLabel en la interfaz. La propiedad se define como no atómica, retener.

He aquí la Luz:

Después de jugar un rato con él un poco más de lo trasladó la declaración pushViewController por encima de las actualizaciones de la etiqueta. Eso resolvió las actualizaciones de la etiqueta.

código de trabajo es el siguiente:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
myObject *tmpObj = [[myObject objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 

myViewController *tmpVC = [[myViewController alloc] initWithNibName:@"NIBfile" bundle:nil]; 

[self.navigationController pushViewController:tmpVC animated:YES]; 

[tmpVC.myLabel setText:tmpObj.myTitle]; // The debugger shows the text: myTitle = "myText" 
NSLog(@"%@", tmpVC.myLabel);    // NSLog SHOWS NULL 

[tmpObj release]; 
} 

Pero no entiendo por qué tengo que empujar mi primera viewController ???

+0

qué lo suelte cualquier parte del código que no sea el dealloc? – Codezy

Respuesta

14

Esto se debe a la vista del controlador está perezosamente crea únicamente cuando se accede. Al presionar el controlador accede a la vista.

Alternativamente, si se agrega una línea para acceder a la propiedad de vista, también funcionará:

myViewController *tmpVC = [[myViewController alloc] initWithNibName:@"NIBfile" bundle:nil]; 
    tmpVC.view; // Force view creation 
    [tmpVC.myLabel setText:tmpObj.myTitle]; // The debugger shows the text: myTitle = "myText" 
    NSLog(@"%@", tmpVC.myLabel);    // NSLog will display "myText" 
    [self.navigationController pushViewController:tmpVC animated:YES]; 
+0

gracias Yar, tiene perfecto sentido! Confusión ido – iFloh

+0

Ya pensé que me había vuelto loco. –

+0

gracias @ Hwee-Boon-Yar Por cierto, tmpVC.view devuelve un aviso [Ver tmpVC] funciona al 100% para mí;) – DeZigny

2

Si tmpVC.myLabel es NULO, eso probablemente indica que no ha realizado la conexión necesaria en Interface Builder desde UILabel a su variable de instancia de myLabel.

+0

Existe la conexión: los medios de propietario del archivo muestra 'mi etiqueta' - 'Etiqueta (myLabel)'. – iFloh

1

¿No es porque su NSLog está tratando de imprimir el objeto de etiqueta real. Si no tiene

NSLog(@"%@", tmpVC.myLabel.text); 

en respuesta a la información añadida: Su otro problema parece ser que ha vinculado una NSString a la etiqueta. Tienes que vincularlo a UILabel. Entonces, donde declare su var myLabel, cámbiela a UILabel *myLabel, y lo mismo para cualquier propiedad que coincida.

+0

hmm, creo que estás ahí, pero (a) cuando intento agregar el "texto" obtengo un error de compilación "miembro" myLabel "no en estructura o unión"
(b) el texto anteriorTexto declaración no produce ninguna actualización en la vista.
Tal vez (a) conduce a la vista no conectada correctamente a la punta o controlador, pero no puede ver dónde podría sentarse la rotura .... – iFloh

+0

agregó más a mi respuesta, vea arriba – Codezy

+0

Hola Codezy, perdón, eso fue un error tipográfico (corregido arriba). IB no me dejaría conectar el 2 w/out una clase correspondiente. La definición es UILabel ... – iFloh

1

¿Tenía @synthesize su myLabel propiedad en myViewController.m? Usted debe ser capaz de hacer algo como:

tmpVC.myLabel.text = tmpObj.myTitle;

+0

Esto fue en mi caso. Olvidé "@synthesize". ¡Gracias! – Bill

1

No estoy seguro pero creo que esto es lo que está pasando:

Cuando se empuja la vista, el controlador carga la vista desde la punta y se conecta las acciones y puntos de venta. Antes de esto, las salidas no están conectadas, por lo que tmpVC.myLabel es nulo.

Si quiere estar seguro, puede poner un punto de interrupción en viewDidLoad de tmpVC para ver cuándo se carga la vista.

Cuestiones relacionadas