it-swarm.com.de

Rufen Sie die Zeilennummer von UITableview mit mehreren Abschnitten auf

Ich habe eine UITableView mit mehreren Abschnitten darin, und jeder Abschnitt hat mehrere Zeilen. Ich möchte die Zeilennummer der ausgewählten Zelle in Bezug auf die gesamte Tabelle und nicht nur den Abschnitt erhalten.

beispiel:

  1. Ich habe zwei Abschnitte in der UITableView, Abschnitt 1 hat 3 Zeilen und Abschnitt 2 hat 5 Zeilen.
  2. Wenn ich die zweite Zeile von Abschnitt 2 auswähle, sollte ich die 5 als Zeilennummer in der didSelectRowAtIndexPath-Methode verwenden, statt 2 als Zeilennummer (was den Abschnitt betrifft).

Ich habe versucht, die Zeilennummer selbst zu ermitteln, indem ich Folgendes ausführte, aber es scheint nicht zu funktionieren:

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

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

int theRow =  indexPath.row;

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

Ich habe überlegt, die Zeilennummer in einer Variable int zu speichern und dann selbst Zeilennummern hinzuzufügen, aber der Code stürzt ab, wenn versucht wird, indexpath.row in theRow zu speichern.

Bitte helfen Vielen Dank

13
hyd00
NSInteger rowNumber = 0;

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

rowNumber += indexPath.row;
43
Wain

Hier ist eine schnelle Anpassung der obigen Antwort von 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

Hier ist eine sauberere Implementierung dieses Konzepts in 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

Ich hatte einen großen Datensatz und die vorherigen Antworten mit for-Schleifen führten in den unteren Abschnitten zu Leistungsproblemen. Am Ende habe ich die Berechnungen durchgeführt und die Dinge etwas beschleunigt.

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

Angenommen, ich implementiere den folgenden Code in didSelectRowAt/didSelectItemAt callbacks ...

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)
}

Beispiel: 2 Abschnitte mit jeweils 3 Zeilen. Ausgewählte Zeile (Position) 1 in Abschnitt 1, index = 4

0
Jakub Truhlář