66 votes

Comment puis-je boucler les cellules d'un UITableView ?

J'ai n sections (quantité connue) et X rangées dans chaque section (quantité inconnue). Chaque ligne possède un champ UITextField. Lorsque l'utilisateur appuie sur le bouton "Terminé", je veux itérer dans chaque cellule et effectuer des tests conditionnels avec le champ UITextField. Si les tests réussissent, les données de chaque cellule sont écrites dans une base de données. Dans le cas contraire, une UIAlert est affichée. Quelle est la meilleure façon de parcourir les lignes en boucle et s'il existe une solution plus élégante, veuillez m'en informer.

163voto

Paul A. Warkentin Points 1853

Si vous voulez seulement itérer à travers les cellules visibles, alors utilisez

NSArray *cells = [tableView visibleCells];

Si vous voulez toutes les cellules de la vue tableau, alors utilisez ceci :

NSMutableArray *cells = [[NSMutableArray alloc] init];
for (NSInteger j = 0; j < [tableView numberOfSections]; ++j)
{
    for (NSInteger i = 0; i < [tableView numberOfRowsInSection:j]; ++i)
    {
        [cells addObject:[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]]];
    }
}

Maintenant vous pouvez itérer à travers toutes les cellules :
( CustomTableViewCell est une classe, qui contient la propriété textField du type UITextField )

for (CustomTableViewCell *cell in cells)
{
    UITextField *textField = [cell textField];
    NSLog(@"%@"; [textField text]);
}

16voto

andrewCanProgram Points 237

Voici une belle implémentation de Swift qui fonctionne pour moi.

 func animateCells() {
        for cell in tableView.visibleCells() as! [UITableViewCell] {
            //do someting with the cell here.

        }
    }

7voto

2ank3th Points 980

Réponse acceptée en swift pour les personnes qui ne connaissent pas ObjC (comme moi).

for section in 0 ..< sectionCount {
    let rowCount = tableView.numberOfRowsInSection(section)
    var list = [TableViewCell]()

    for row in 0 ..< rowCount {
        let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: row, inSection: section)) as! YourCell
        list.append(cell)
    }
}

4voto

luhuiya Points 23

Pour xcode 9 utilisez ceci - (similaire à @2ank3th mais le code est modifié pour swift 4) :

let totalSection = tableView.numberOfSections
for section in 0..<totalSection
{
    print("section \(section)")
    let totalRows = tableView.numberOfRows(inSection: section)

    for row in 0..<totalRows
    {
        print("row \(row)")
        let cell = tableView.cellForRow(at: IndexPath(row: row, section: section))
        if let label = cell?.viewWithTag(2) as? UILabel
        {
            label.text = "Section = \(section), Row = \(row)"
        }
    }
}

2voto

Darshit Shah Points 251
for (UIView *view in TableView.subviews) {
    for (tableviewCell *cell in view.subviews) {
       //do
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X