14

我有一个UITableView, 里面有多个部分,每个部分都有多行。我想获取所选单元格相对于整个表格的行号,而不仅仅是部分。

例子:

  1. 我有两个部分UITableView,第 1 部分有 3 行,第 2 部分有 5 行。
  2. 当我选择第 2 部分的第 2 行时,我应该将 5 作为didSelectRowAtIndexPath方法中的行号,而不是将 2 作为行号(与该部分相关)。

我尝试通过执行以下操作自己获取行号,但它似乎不起作用:

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

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

int theRow =  indexPath.row;

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

我正在考虑将行号存储在一个int变量中,然后自己将行号添加到其中,但是在尝试存储时代码会 indexpath.row崩溃theRow

请帮忙。谢谢

4

7 回答 7

44
NSInteger rowNumber = 0;

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

rowNumber += indexPath.row;
于 2013-06-06T17:44:51.090 回答
9

这是 Wain 对上述答案的 Swift 改编

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
}
于 2015-04-09T12:49:59.667 回答
8

下面是这个概念在 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...
}
于 2016-02-08T23:04:09.040 回答
2

我有一个大数据集,之前使用 for 循环的答案在较低部分对我造成了性能问题。我最终提前进行了计算并加快了速度。

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
    }
}
于 2016-04-27T23:05:48.600 回答
1

以下是 @Wain 解决方案的 Swiftier 版本:

let rowNumber = Array(0..<indexPath.section).reduce(0) { $0 + tableView.numberOfRows(inSection: $1) } + indexPath.row
于 2021-11-23T16:06:21.987 回答
0

假设我在didSelectRowAt/didSelectItemAt回调中实现下面的代码......

UITableView

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

UICollectionView

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

示例:2 个部分,每个部分 3 行(项目)。第 1 部分中的选定行(项目)1,index= 4

于 2017-11-13T14:31:42.837 回答
-4

我不知道多个部分,但我可以给你一个部分...

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger index=indexPath.row;
NSString *string=[[NSString alloc]initWithFormat:@"%ld",(long)index];
}

从这里你可以得到行号,你可以将它保存到字符串中......

于 2014-09-28T18:38:48.600 回答