2009-05-08 15 views
25

Estoy implementando un UITableView rico con UITableViewCell creado a medida, lo muestro en la pantalla de una manera, pero una vez que salen de la pantalla quiero tomar nota de eso, ya que La segunda vez que vienen me gustaría que se muestren de una manera diferente. Piense en "marcar como leído" automáticamente cuando salga de la pantalla.Detecta cuando UITableViewCell desaparece de la pantalla

He estado buscando alguna manera de detectar cuándo una célula sale de la pantalla (get's dealloc'ed o dequeued o equivalente), preferiblemente en la clase: UITableViewController para hacer una nota rápida de la fila [indexPath], pero en el: UITableViewCell es igual de bueno.

No he podido hacer esto de manera estándar ... contar las veces que apareció parece descartado ya que realizo múltiples llamadas de recarga de datos en la mesa.

¿Alguien alguna idea? Esto parece un poco complicado :)

Respuesta

-1

Creo que intentaría comprobar periódicamente la propiedad indexPathsForVisibleRows de UITableView. Desde la ruta de índice más grande, puede deducir que todas las filas anteriores se han desplazado.

+0

Sí, esa sería una opción, podría colocar esa llamada en el cellForRowAtIndexPath. Sin embargo, tengo filas de altura variable, por lo tanto, esto no garantizaría que una celda fuera de la pantalla se marque como fuera de pantalla: | –

5

Creo que se podría utilizar el método

- (NSArray *)visibleCells 

para su UITableView. Esto devuelve una matriz de todas las celdas que son visibles. A continuación, puede marcar cualquier dato "no visible" (es decir, no en esta matriz) de la manera que desee, de modo que cuando se desplace hacia atrás, se haya actualizado.

Espero que ayude

1

¿Está seguro de una célula va fuera de la pantalla es exactamente lo que se desea capturar? Si desea marcar elementos como leídos, esto no parece una forma adecuada de hacerlo. Por ejemplo, podría desplazarme rápidamente por la tabla, y me sorprendería mucho si marcara todas las cosas como leídas.

En cuanto a la parte técnica, sólo tiene que mantener una lista de las células que se encuentran en la pantalla (cellForRowAtIndexPath debe añadir células a esa lista), y en scrollViewDidScroll cheque método delegado si alguno de ellos ya no son visibles.

Otra idea posible: recuerdo que hay un método prepareForReuse en la celda. Sin embargo, no estoy seguro de cuándo se llama.

1

El método prepareForReuse en UITableViewCell que menciona Andrey Tarantsov se ve bien. Poner un par de NSLogs allí le permite imprimir los valores de cualquier variable de la celda. ¿Alguna idea de cómo se puede volver a establecer esto en el controlador de vista de tabla?

+0

Uso un delegado para hacer esto –

6

Una vez que UITableViewCell es invisible, se eliminará de UITableView. Puede anular el método -(void)removeFromSuperView y hacer algo dentro del método. Por último, no te olvides de llamar al [super removeFromSuperView].

+0

Esto no parece ser una solución confiable. Acabo de probar esto en el simulador iOS 6.0, las celdas parecen estar configuradas como ocultas en lugar de eliminarse. Por extraño que parezca, 'setHidden: YES' tampoco se llama en mi implementación. Aparentemente en la implementación de tableView, el ivar se establece directamente, omitiendo el método de establecimiento de la propiedad. –

+0

El método removeFromSuperView no recibe una llamada después de la subclase de UITableViewCell –

58

Ésta es una cuestión de edad, pero en caso de que alguien está mirando, en iOS 6, una nueva función UITableViewDelegate se introdujo que hace precisamente esto:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

Se hace un gran trabajo en la que le dice cada vez que una célula es eliminado, sin embargo, es muy completo y, por lo tanto, si hiciste una celda de recarga, incluso la celda anterior que se está reemplazando activará esta función de delegado. En mi implementación, simplemente verifico si el indexPath aprobado todavía está dentro del arreglo tableView.indexPathsForVisibleRows.Algo como:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([tableView.indexPathsForVisibleRows indexOfObject:indexPath] == NSNotFound) 
    { 
     // This indeed is an indexPath no longer visible 
     // Do something to this non-visible cell... 
    } 
} 
+0

Esta es la solución que estoy buscando, pero para iOS 5.0. ¿Alguna sugerencia? –

+0

Lamentablemente, nada proporcionado por Apple. Lo que hice fue usar scrollViewDidScroll y hacer un cálculo rápido para ver si la matriz visibleCells ha cambiado desde el "marco" anterior de la vista de desplazamiento, en cuyo caso hago algo con la celda que ahora falta. ¡Espero que ayude! –

+0

Gracias! ¡Justo lo que estaba buscando! – Undo

Cuestiones relacionadas