web-dev-qa-db-fra.com

Obtenir le numéro de ligne de UITableview avec plusieurs sections

J'ai un UITableView, avec plusieurs sections, et chaque section a plusieurs lignes. Je veux obtenir le numéro de ligne de la cellule sélectionnée par rapport à l'ensemble du tableau et non à la section uniquement.

exemple:

  1. J'ai deux sections dans le UITableView, la section 1 a 3 lignes et la section 2 a 5 lignes.
  2. Lorsque je sélectionne la deuxième ligne de la section 2, je devrais obtenir 5 comme numéro de ligne dans la méthode didSelectRowAtIndexPath, plutôt que 2 comme numéro de ligne (ce qui concerne la section).

J'ai essayé d'obtenir le numéro de ligne moi-même en procédant comme suit, mais cela ne semble pas fonctionner:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

NSLog(@"%d",indexPath.row);

int theRow =  indexPath.row;

NSLog(@"%d",theRow);
}

Je pensais stocker le numéro de ligne dans une variable int, puis y ajouter moi-même des numéros de ligne, mais le code se bloque lorsque vous essayez de stocker indexpath.row dans theRow.

S'il vous plaît aider. Je vous remercie

13
hyd00
NSInteger rowNumber = 0;

for (NSInteger i = 0; i < indexPath.section; i++) {
    rowNumber += [self tableView:tableView numberOfRowsInSection:i];
}

rowNumber += indexPath.row;
43
Wain

Voici une adaptation rapide de la réponse ci-dessus par Wain

class func returnPositionForThisIndexPath(indexPath:NSIndexPath, insideThisTable theTable:UITableView)->Int{

    var i = 0
    var rowCount = 0

    while i < indexPath.section {

        rowCount += theTable.numberOfRowsInSection(i)

        i++
    }

    rowCount += indexPath.row

    return rowCount
}
9
PJeremyMalouf

Voici une mise en œuvre plus propre de ce concept dans Swift:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->
    var rowNumber = indexPath.row
    for i in 0..<indexPath.section {
        rowNumber += self.tableView.numberOfRowsInSection(i)
    }

    // Do whatever here...
}
7
Max Masnick

J'avais un gros ensemble de données et les réponses précédentes utilisant des boucles for posaient des problèmes de performances pour moi dans les sections inférieures. J'ai fini par faire les calculs à l'avance et j'ai accéléré un peu les choses.

private var sectionCounts = [Int:Int]()

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let number = fetchedResultsController.sections?[section].numberOfObjects ?? 0
    if section == 0 {
        sectionCounts[section] = number
    } else {
        sectionCounts[section] = number + (sectionCounts[section-1] ?? 0)
    }
    return number
}

func totalRowIndex(forIndexPath indexPath: NSIndexPath) -> Int {
    if indexPath.section == 0 {
        return indexPath.row
    } else {
        return (sectionCounts[indexPath.section-1] ?? 0) + indexPath.row
    }
}
1
SirRupertIII

Disons que j'implémente le code ci-dessous dans les rappels didSelectRowAt/didSelectItemAt ...

UITableView

var index: Int = indexPath.row
for i in 0..<indexPath.section {
    index += collectionView.numberOfRows(inSection: i)
}

UICollectionView

var index: Int = indexPath.item
for i in 0..<indexPath.section {
    index += collectionView.numberOfItems(inSection: i)
}

Exemple: 2 sections, 3 lignes (éléments) chacune. Ligne sélectionnée (élément) 1 dans la section 1, index = 4

0
Jakub Truhlář