2009-12-03 15 views
8

Quiero cambiar el textLabel y detailTextLabel de una celda cuando se ha seleccionado. He intentado lo siguiente, pero no hay cambio:¿Cómo se cambia la etiqueta de texto cuando se selecciona UITableViewCell?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    MyAppDelegate *appDelegate = (MyPhoneAppDelegate*)[[UIApplication sharedApplication] delegate]; 

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    cell.detailTextLabel.text = @"xxxxx"; 
    cell.textLabel.text =  @"zzzzz"; 
    [tableView reloadData]; 
} 

Respuesta

-1

¿trató de refrescar sólo la celda seleccionada en lugar de recargar toda la tabla?

[cell setNeedsDisplay];

en lugar de

[tableView reloadData];

Esto tendrá un mejor rendimiento y no soy pero supongo que la selección se perderá si actualiza toda la tabla (esta puede ser la razón por la cual no ve ningún cambio al final) ....

+0

¿Qué sucede si estás usando una vista de celda personalizada? – meridimus

+0

una vista de celda personalizada es una vista configurada en contentView de una UITableViewCell, así que es lo mismo, setNeedsDisplay volverá a dibujar contentView. – yonel

2

No debe intentar volver a cargar la tabla mientras se selecciona una celda. En su lugar, tratar

[setNeedsLayout celular]

después de realizar los cambios anteriores en las etiquetas.

Además, ¿hay algún motivo para hacer referencia al delegado de la aplicación en el método?

+0

Esto funcionó perfectamente para mí. ¡Gracias! – Nick

10

Acepto, volver a cargar la vista de tabla en realidad va a volcar y volver a cargar/mostrar todas las celdas usando tableView:cellForRowAtIndexPath: y usar los datos originales, no la @ @ xxxxx @ y @ "yyyyy" actualizadas en su método tableView:didSelectRowAtIndexPath:.

En un proyecto de prueba poco tuve la oportunidad de cambiar las etiquetas de la selección con:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath]; 
    cell.textLabel.text = @"it was tapped"; 
} 
0

Crear un proyecto nuevo iPad (Dividir vista) y ahora pasar por el Classes-> Archivos. La forma más fácil se ha dado allí. Los Códigos Generados de XCode.

Líneas Código de ejemplo: -

cell.textLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row]; 

Puede utilizarlos en cellForRowAtIndexPath ||&& didSelectRowAtIndexPath ..

2

intenta volver a cargar la celda seleccionada (descrito por indexPath):

[yourTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
0

No está seguro de lo que Estoy tratando de hacer con el delegado, pero debería intentar llamar al tableView ya instanciado; es decir, llamar

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath: indexPath]; 

Tal vez no me queda claro Lo que estoy diciendo es que usted está instanciar una nueva vista de tabla vacía

UITableViewCell *cell = [**tableView** cellForRowAtIndexPath: indexPath]; //cell has nothing it is new. 

considerar la sustitución de llamar a la edad

UITableViewCell *cell = [**self.tableView** cellForRowAtIndexPath: indexPath]; //now you have one that has a textField already in it 
+0

¿Ves lo que estoy diciendo? Estás creando una nueva instancia, no la anterior. –

+0

Si creas uno nuevo, debes volver a cargar los datos para verlos en la vista de tabla. Si usa el anterior, la vista reflejará los cambios. –

Cuestiones relacionadas