2011-03-17 12 views
12

Tengo una vista de texto dentro de una UITableViewCell. El texto dentro de TextView se puede editar allí mismo.Cambiar la altura de la fila de UITableView sin ignorar el teclado

El TextView crece y se contrae verticalmente según el número de líneas que contenga el texto. Hasta ahora, no he encontrado la posibilidad de permitir que la fila que contiene el TextView crezca y se reduzca de forma dinámica.

[tableView reloadData]; 

o

[tableView reloadRowsAtIndexPaths: withRowAnimation:]; 

no funcionan, porque ocultar el teclado en cada cambio.

¿Hay alguna manera de cambiar la altura de una fila individual en una UITableView sin descartar el teclado?

Respuesta

30

Sí, puede hacer que las alturas de fila se ajusten a medida que escribe. No está documentado, y que desafía la razón, pero todo lo que necesita hacer es fijar el nuevo valor en tableView.rowHeight (o tienen heightForRowAtIndexPath: listo para calcular las nuevas alturas), a continuación, haga lo siguiente:

[tableView beginUpdates]; // updates the row heights ... 
[tableView endUpdates]; // ... nothing needed in between 
+0

¡Sí! ¡Increíble! Una advertencia, sin embargo: solo funciona cuando guardo el texto actual en cada evento de edición desde el TextView a la variable que llena el TextView en la carga de la celda. beginUpdates/endUpdates no parecen acceder exactamente al mismo objeto y texto TextView que estoy editando. – Stefan

+0

Parece que funciona solo para iOS> = 4.0 sin que el teclado rebote hacia abajo y hacia arriba. – Stefan

+0

¡YAY! Gracias. Me tomó un tiempo encontrar las palabras clave correctas de Google, pero me ahorraste muchas molestias. –

0

Después de reloadRowsAtIndexPaths la celda cambia el valor de la memoria, por lo que si llama a becomeFirstResponder justo después de reloadRowsAtIndexPaths, está tratando de establecer como firstResponder la celda anterior, que no existe (becomeFirstResponder devuelve false y exits del teclado).

La solución es llamar nuevamente a cellForRowAtIndexPath para obtener el nuevo valor de memoria de la celda recargada, y luego llamar a becomeFirstResponder a esa celda.

+0

bien, gracias. Desafortunadamente, esta no es una solución para el problema original, ya que hace que el teclado rebote y suba. La llamada a becomeFirstResponder, a pesar de que funciona a su manera, es demasiado tarde, el teclado ya comenzó a desaparecer (debido a la recargaRowsAtIndexPath, supongo). – Stefan

0

La tarea es invocar el recálculo de la altura de fila sin reutilización de celda (para salvar al respondedor actual).

Uno puede llamar moveRowAtIndexPath:toIndexPath: para el mismo indexPath justo después de cambio de altura

- (void)textInputTableView:(UITableView *)tableView cellHeightDidChangeForIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView moveRowAtIndexPath:indexPath toIndexPath:indexPath]; 
} 
Cuestiones relacionadas