IndexPath.row 多个部分的错误值

Posted

技术标签:

【中文标题】IndexPath.row 多个部分的错误值【英文标题】:IndexPath.row wrong value with multiple sections 【发布时间】:2015-07-27 17:33:53 【问题描述】:

每个部分都有部分和不同的数组。它工作得很好,并显示了正确的对象。但是当我将标签设置为 UIBUtton 时,作为 button.tag 传递的 indexPath.row 在第二个会话中返回 1 而不是 0..

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

NSString *sectionTitle = [sectionsTitles objectAtIndex:indexPath.section];
NSArray *secAtt = [attractions objectForKey:sectionTitle];

Evento *evento = (Evento*)[secAtt objectAtIndex:indexPath.row];

UITableViewCell *cell = nil;
if(evento.listaImagens && [evento.listaImagens count] > 0) 
    cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

else 
    cell = [tableView dequeueReusableCellWithIdentifier:@"CellSemFoto" forIndexPath:indexPath];


    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
 UIButton *btnCompartilhar = (UIButton *)[cell.contentView viewWithTag:40];
    [btnCompartilhar.titleLabel setHidden:YES];
    btnCompartilhar.titleLabel.text = sectionTitle;
    btnCompartilhar.tag = indexPath.row;
    [btnCompartilhar addTarget:self action:@selector(compartilharClick:) forControlEvents:UIControlEventTouchDown];
  return cell;
 

在这里我得到了 indexPath

  UIButton *botaoCompartilhar = (UIButton *)sender;
   int index = botaoComapartilhar.tag;

索引在第二部分的第一行返回 1

编辑 我发现 indexpath.row 是正确的,但没有设置 botaoCompartilhar.tag。

我是通过以下代码发现的:

 UIButton *btnCompartilhar = (UIButton *)[cell.contentView viewWithTag:40];
[btnCompartilhar.titleLabel setHidden:YES];
btnCompartilhar.titleLabel.text = sectionTitle;
btnCompartilhar.tag = indexPath.row;
[btnCompartilhar addTarget:self action:@selector(compartilharClick:) forControlEvents:UIControlEventTouchDown];
NSLog(@"%@ %i %i", evento.entretenimento.nome, btnCompartilhar.tag, indexPath.row);

【问题讨论】:

索引的用途是什么? 例如。第二部分的第二行返回 0 而不是 1...将是 1...有时索引是错误的...0 而不是 1. 1 而不是 0..1 而不是 2...只有第一部分总是正常工作 我的意思是 int index 变量将用于什么? 变量索引用于知道当用户点击分享按钮时应该从数组中取出哪个元素 【参考方案1】:

两个观察结果:

    您有两个部分,然后如果您将标签设置为 indexPath.row,那么在选择器中您将有两个带有标签 1 的按钮,两个用于标签 2,依此类推。 我更喜欢使用 Control UIControlEventTouchUpInside 而不是 UIControlEventTouchDown

所以总结一下,尝试做:

btnCompartilhar.tag = indexPath.section*1000 + indexPath.row;

代替:

btnCompartilhar.tag = indexPath.row;

因此,您将获得所有按钮的唯一标记值。然后您需要管理索引,例如:

NSInteger indexSection = (button.tag)/1000;
NSInteger indexRow = (button.tag)%1000;

if (indexSection == 0)
    //first section
    //go get the element on index indexRow of the first section array
 else 
    //second section
    //go get the element on index indexRow of the second section array

【讨论】:

问题不在于 indexPath.row。我进行了调试,发现我的 btnCompartilhar 的 viewWithTag 只工作了一次。为什么?【参考方案2】:

问题是我使用viewWithTag并将Button的标签更改为indexPath.row...然后下一次,没有viewWithTag 40。

我的解决方案是

  UIButton *btnCompartilhar = (UIButton *)[cell.contentView viewWithTag:40];
[btnCompartilhar.titleLabel setHidden:YES];
btnCompartilhar.titleLabel.text = [NSString stringWithFormat:@"%i|%@",indexPath.row, sectionTitle]; 
[btnCompartilhar addTarget:self action:@selector(compartilharClick:) forControlEvents:UIControlEventTouchDown];

并获取 indexPath.row 和 sectionTitle:

int tag = 0;
NSString *titleLabel = botaoCompartilhar.titleLabel.text;

NSRange range = [botaoCompartilhar.titleLabel.text rangeOfString:@"|"];
if(range.location != NSNotFound) 
    NSString *tagStr = [botaoCompartilhar.titleLabel.text substringToIndex:range.location];
    tag = [tagStr intValue];
    if([botaoCompartilhar.titleLabel.text length] > range.location+1)
        titleLabel = [botaoCompartilhar.titleLabel.text substringFromIndex:range.location+1];

【讨论】:

***.com/questions/31661490/…

以上是关于IndexPath.row 多个部分的错误值的主要内容,如果未能解决你的问题,请参考以下文章

如何获取当前正在显示的tableView的indexPath.row?

在 TableView 中查找 [indexpath.row] 值

UITableView:IndexPath.row 超出范围(致命错误)

错误:无法将“[String]”类型的值分配给 swift 中的“String”类型

在一个单元格中加载多个 Xib 视图

UITableViewCell 问题 indexPath.row 无法正确显示