2011-11-21 12 views
6

Tengo un UITable que contiene algunas aduanas UITableCells. Esas celdas contienen algunos UILabels y un UITextField. El origen de datos de la tabla proviene de la propiedad de un controlador principal. (Este controlador también es el delegado y dataSource para la tabla).Recargue un UITable sobre la marcha al editar un UITextField dentro de una de las celdas

Aquí hay una captura de pantalla simplificada de la interfaz de usuario:

schreenshot

Ahora, es necesario que actualice "sobre la marcha" el contenido de todos los UILabels cuando el usuario edita una de las UITextFields. Para hacerlo, en el momento estoy escuchando el evento "Edición modificada" en el nivel de UITextField. Esto desencadena la acción siguiente:

- (IBAction) editChangeHandler: (id) sender { 
    MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
    [[delegate.viewController.myDataSourceArray objectAtIndex:self.rowIndex] setANumber: [theTextField.text intValue]]; 
    [delegate.viewController reloadRows]; 
} 

El método reloadRows en el viewController es como tal:

- (void) reloadRows { 
    NSLog(@"called reloadRows"); 
    //perform some calculations on the data source objects here... 
    [theUITable reloadData]; 
} 

Mi problema aquí es que cada vez que el usuario cambia el valor en el campo, el método reloadRows es éxito llamado, aparentemente es el ReloadData pero también causa que el teclado sea descartado.

Por lo tanto, al final, el usuario solo puede tocar una tecla cuando edita el TextField antes de cerrar el teclado y volver a cargar la tabla.

¿Alguien sabe una solución a esto o ha experimentado el mismo problema?

Respuesta

3

Puede modificar selectivamente las filas según sea necesario, en lugar de actualizar toda la tabla (esto es actualizar la celda en la que está trabajando actualmente, restablecer su estado).

Mira:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 

Además, puede editar las células directamente mediante la obtención de la célula a través de:

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath 

si no quieren tener que reconstruir esas células.

+0

Arf! Gracias ! La desactivación del teclado se explicó por el restablecimiento del estado de la celda. ¿Cómo podría no haber visto eso?:-) Como necesitaba que las etiquetas de la fila actual también se actualizaran, terminé siguiendo su segunda sugerencia y escribí un nuevo método en el controlador que solo actualiza las etiquetas de las filas individuales. – Saze

3

Me encontré con el mismo problema. En mi caso, estaba intentando crear un controlador genérico, por lo que escribir un método específico para reconstruir las células manualmente no era una buena opción.

Aquí está la solución que se me ocurrió:

  1. temporalmente crea un campo de texto en alguna otra celda de la tabla se convierten en el primer nivel de respuesta.
  2. Llamada reloadRowsAtIndexPaths para volver a cargar la celda que tu usuario estaba editando.
  3. Hacer que el campo que el usuario estaba editando se convierta en el primero en responder de nuevo.

Funciona como un encanto. El teclado permanece visible sin parpadear, la celda se actualiza adecuadamente y el usuario puede seguir escribiendo en el mismo campo que estaba editando originalmente.

Cuestiones relacionadas