web-dev-qa-db-fra.com

iPad: Itérer sur chaque cellule d'un UITableView?

iPad: Itérer sur chaque cellule d'un UITableView?

33
MikeN
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'
    }
}
65
aroth

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)

26
AndrewPK

(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.

4
zekel

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
    }
}
2
darvids0n

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.

1
Zinan Xing

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.

0
IsPha

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

0
Oz Shabat