获取具有多个部分的UITableview的行号

时间:2013-06-06 17:37:04

标签: ios objective-c uitableview didselectrowatindexpath

我有一个UITableView,其中有多个部分,每个部分都有多行。我想获得相对于整个表格的所选单元格的行号,而不是仅包含该部分。

示例:

  1. 我在UITableView中有两个部分,第1部分有3行,第2部分有5行。
  2. 当我选择第2行的第2行时,我应该将{5}作为didSelectRowAtIndexPath方法中的行号,而不是将2作为行号(相对于该部分)。
  3. 我尝试通过执行以下操作来获取行号,但它似乎不起作用:

    - (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时代码崩溃了。< / p>

    请帮忙。谢谢

6 个答案:

答案 0 :(得分:44)

NSInteger rowNumber = 0;

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

rowNumber += indexPath.row;

答案 1 :(得分: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
}

答案 2 :(得分:7)

这里是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...
}

答案 3 :(得分:1)

我有一个大数据集,之前使用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
    }
}

答案 4 :(得分:0)

我想在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)
}
  

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

答案 5 :(得分:-4)

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

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger index=indexPath.row;
NSString *string=[[NSString alloc]initWithFormat:@"%ld",(long)index];
}
从这里你可以获得行号,你可以将它保存到字符串....