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:
UITableView
, la section 1 a 3 lignes et la section 2 a 5 lignes.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
NSInteger rowNumber = 0;
for (NSInteger i = 0; i < indexPath.section; i++) {
rowNumber += [self tableView:tableView numberOfRowsInSection:i];
}
rowNumber += indexPath.row;
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
}
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...
}
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
}
}
Disons que j'implémente le code ci-dessous dans les rappels didSelectRowAt
/didSelectItemAt
...
var index: Int = indexPath.row
for i in 0..<indexPath.section {
index += collectionView.numberOfRows(inSection: i)
}
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