2010-12-07 33 views
13

Acabo de encontrar un comportamiento muy extraño e inesperado en la clase UITableView. Necesito la última celda de la tabla en mi sección de ser una altura diferente de las otras células, por lo que estoy haciendo básicamente esto:Llamando numberOfRowsInSection: from heightForRowAtIndexPath

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == [tableView numberOfRowsInSection:indexPath.section] - 1) 
     return 44; 
    else 
     return 88; //double size for all but the last row 
} 

parece bastante sencillo, pero cuando lo ejecuto, me sale un infinito bucle y se bloquea. Decidí que cuando llamo al numberOfRowsInSection:, llama al método tableView: numberOfRowsInSection: de mi fuente de datos. Esto tiene sentido ya que el método de tableView devuelve una versión almacenada en caché del valor de la fuente de datos, por lo que necesita obtener el valor de la fuente de datos la primera vez. Pero luego, llama a heightForRowAtIndexPath, pasando de nuevo indexPath [0, 0]! Y lo hace sin parar.

que era capaz de conseguir alrededor de él mediante el uso de

[self tableView:tableView numberOfRowsInSection:indexPath.section] 

lugar (llamar a mi método de fuente de datos en lugar del método de la tableView). Alguien tiene alguna idea de por qué hace esto? ¿Es este comportamiento definido? ¿O un error en el marco TableView de Apple?

+0

Parece que el manejo interno de Apple. Supongo que necesitaríamos un ingeniero de Apple para responder a este. – Altealice

+0

¿No deberían ser flotadores 44.0 y 88.0? – railwayparade

+0

Tal vez sea técnicamente más eficiente de esa manera, decirle al compilador por adelantado que es una carroza ... pero no me puedo imaginar que sea una gran diferencia en el rendimiento; cualquier flotador que tenga que tenga un punto 0 al final se escribe así, y no he encontrado ningún problema ... – GendoIkari

Respuesta

17

El problema es que el UITableView está pidiendo datos a su fuente de datos, y le está diciendo que la respuesta depende de los datos que no se ha guardado en la memoria caché.

No entiende bien el diseño M-V-C en el que Apple basa sus controles. La respuesta a la altura de una fila debe provenir de su modelo, NO de una llamada a la clase de vista. Esto está provocando que la clase de vista solicite más información (para construir su memoria caché interna), que está iniciando un conjunto de llamadas recursivas.

Asegúrese de que todos los métodos delegados de origen de datos devuelvan datos de su modelo y no confíe en que la vista almacena en caché nada. Si depura cualquier vista basada en la fuente de datos, se sorprenderá de cuántas veces UITableView pide datos. Pero esa es la forma en que Apple lo codificó.

+0

¡Gracias! Ese es un buen punto ... Por encima de todo, no estoy seguro de por qué estaba pidiendo numberOfRowsInSection, en lugar de simplemente usar la misma información de modelo que usé para obtener el número de filas en primer lugar ... . – GendoIkari