iPad: Itérer sur chaque cellule d'un UITableView?
for (int section = 0; section < [tableView numberOfSections]; section++) {
for (int row = 0; row < [tableView numberOfRowsInSection:section]; row++) {
NSIndexPath* cellPath = [NSIndexPath indexPathForRow:row inSection:section];
UITableViewCell* cell = [tableView cellForRowAtIndexPath:cellPath];
//do stuff with 'cell'
}
}
Pour parcourir toutes les cellules visibles dans un UITableView:
for (UITableViewCell *cell in self.tableView.visibleCells) {
NSIndexPath *cellIndexPath = [self.tableView indexPathForCell:cell];
(édité pour mieux préciser la réponse et espérer que cela sera mieux indexé pour les résultats de recherche dans le but de faire gagner plus de temps aux autres)
(Cela s'appuie sur aroths answer.)
J'aime définir cette catégorie en tant que catégorie à UITableView
, de sorte qu'elle est disponible partout.
(Comme mentionné à plusieurs reprises, vous devez être sûr que vous vraiment voulez effectuer une itération sur les cellules elles-mêmes. Par exemple: je l'utilise pour effacer les UITableViewAccessoryCheckmark
de toutes les cellules avant de le définir sur la cellule sélectionnée par l'utilisateur. La règle empirique est de ne le faire que si les méthodes de la source de données ne peuvent pas faire ce que vous devez faire.)
Définir comme ceci:
- (void)enumerateCellsUsingBlock:(void (^)(UITableViewCell *cell))cellBlock {
NSParameterAssert(cellBlock != nil);
for (int section = 0; section < [self numberOfSections]; section++) {
for (int row = 0; row < [self numberOfRowsInSection:section]; row++) {
NSIndexPath *cellPath = [NSIndexPath indexPathForRow:row inSection:section];
UITableViewCell *cell = [self cellForRowAtIndexPath:cellPath];
if (cellBlock != nil) {
cellBlock(cell);
}
}
}
}
Appel comme ça:
[self.tableView enumerateCellsUsingBlock:^(UITableViewCell *cell) {
NSLog(@"cell:%@", cell);
}];
Il serait bon de taper le bloc aussi.
En supposant qu'une variable myTableView
existe et que son délégué et sa source de données soient tous deux définis:
UITableViewCell *cell;
NSIndexPath indexPath = [[NSIndexPath indexPathForRow:0 inSection:0];
for(indexPath.section = 0; indexPath.section < [myTableView numberOfSections]; ++indexPath.section)
{
for(indexPath.row = 0; indexPath.row < [myTableView numberOfRowsInSection:indexPath.section]; ++indexPath.row)
{
cell = [myTableView cellForRowAtIndexPath:indexPath];
// do something with this cell
}
}
Encore plus simple et élégant:
-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath {
// use the "cell" here
}
Mais évidemment, cela ne convient pas à toutes les situations.
C’est comme cela que je vois toutes les cellules de la table, même les moins visibles. Vérifiez ma réponse ici:
https://stackoverflow.com/a/32626614/2715840
Indice: code en Swift.
Swift 4:
for section in 0...self.tableView.numberOfSections - 1 {
for row in 0...self.tableView.numberOfRows(inSection: section) - 1 {
let cell = self.tableView.cellForRow(at: NSIndexPath(row: row, section: section) as IndexPath)
print("Section: \(section) Row: \(row)")
}
}
par steve Itérer sur toutes les UITableCells étant donné un identifiant de section