iphone cocoa-touch uitableview

iphone - Obtener celda visible desde pagable de UITableView habilitado



cocoa-touch (4)

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 anchura 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 entre ellas no es tan fácil. El problema es que se llama dos veces a cellForRowAtIndexPath para estas celdas intermedias. Esto es lo que parece desplazarse de la primera a la última celda y luego volver. He enumerado los índices en orden a medida que cellForRowAtIndexPath se activa para esa fila:

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

Podría establecer usar un objeto NSDate para detectar si estoy en una fila central. Al diferenciar el tiempo anterior con el actual, lo sabré. Sin embargo, si el usuario se desplaza muy rápido por las celdas, probablemente no funcione. ¿Hay otra manera de hacerlo?

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


Bueno, en caso de que nunca hayas encontrado una solución, o para quien llegue a esta pregunta a continuación, te daré la respuesta que estabas buscando. UITableView le proporcionará las indexPaths que está buscando, y luego UITableView le proporcionará con gusto las celdas que coinciden con esas rutas de í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.


Ejemplo de Douglas convertido 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)!) }


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


Una forma simple y elegante de recuperar celdas visibles de UITableView , sin necesidad de obtener celdas visibles mediante el uso de valores de indexpath

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

Si se indexpath de celdas visibles

NSArray * paths = [tableView indexPathsForVisibleRows];