2009-06-15 26 views
16

Tengo un UITableView con pagingEnabled. Cada celda ocupa el área de visualización de la tabla. Es decir, cada celda tiene la misma altura y ancho que la tabla. Estoy usando celdas personalizadas que tienen una propiedad de nombre. Me gustaría mostrar el nombre de la celda actual (visible) en una etiqueta. Esto funciona bien para la primera y la última celda, pero cualquier cosa intermedia no es tan fácil. El problema es que cellForRowAtIndexPath se llama dos veces para estas celdas intermedias. Esto es lo que parece desplazarse desde la primera hasta la última celda y luego volver. He enumerado los índices en orden como incendios cellForRowAtIndexPath para esa fila:Obtener la celda visible de UITableView pagingEnabled

Row    indexPath.row 
0     0   //view loads and table appears 
1     1,2  //user scrolls to second cell. cellForRowAtIndexPath fires twice. First time indexPath.row is one and second time it is two. This causes cell two's name to display in the label, rather than cell one. 
2     2,3 
3     3 
//user starts scrolling back to first cell 
2     1,2 
1     1,0 
0     0 

pude configurar utilizar un objeto NSDate para detectar si estoy en una fila del medio. Al diferir la hora anterior con la actual, lo sabré. Sin embargo, si el usuario se desplaza rápidamente por las celdas, probablemente no funcione. ¿Hay alguna otra forma de hacerlo?

He intentado usar variaciones de las propiedades de las celdas visibles pero eso no funcionó. La UITableView cargará la siguiente celda incluso si no está visible, lo que hace que forme parte de las celdas visibles.

Respuesta

44

Bueno, en el caso de que nunca hayas encontrado una solución, o para cualquiera que se ocupe de esta cuestión a continuación, te daré la respuesta que estabas buscando. UITableView le proporcionará los indexPaths que usted está buscando, y luego UITableView felizmente le proporcionará con las células que responden a esos caminos índice:

UITableView *tableView = self.tableView; // Or however you get your table view 
NSArray *paths = [tableView indexPathsForVisibleRows]; 

// For getting the cells themselves 
NSMutableSet *visibleCells = [[NSMutableSet alloc] init]; 

for (NSIndexPath *path in paths) { 
    [visibleCells addObject:[tableView cellForRowAtIndexPath:path]]; 
} 

// Now visibleCells contains all of the cells you care about. 
+1

El único problema con esto es que no están clasificados ... ¿hay una forma rápida y fácil de ordenarlos o agregarlos a la matriz en el orden correcto? –

+0

+1 este responde mis preguntas también. –

+21

también puede obtener celdas visibles con [tableView visibleCells]; – George

2

En lugar de centrarse en cuándo UITableView solicita una celda, debe centrarse en cuándo muestra la celda, lo que se indica mediante el método delegado tableView:willDisplayCell:forRowAtIndexPath.

+0

willDisplayCell arroja los mismos resultados que publiqué. – 4thSpace

2

ejemplo convertido Douglas a Swift:

let tableView = self.tableView // Or however you get your table view 
let paths = tableView.indexPathsForVisibleRows 

// For getting the cells themselves 
let visibleCells : NSMutableSet = [] 

for path in paths! { 
    visibleCells.addObject(tableView.cellForRowAtIndexPath(path)!) 
} 
0

simple y manera elegante para recuperar celdas visibles de UITableView, no hay necesidad de celdas visibles mediante el uso de valores de indexpath

NSArray * visibleCells = tableView.visibleCells; 
NSLog(@"Total visible Cells: %i", [visibleCells count]); 

Si indexpath de celdas visibles son necesarias

NSArray * paths = [tableView indexPathsForVisibleRows]; 
Cuestiones relacionadas