indexPath.row返回最后一个可见单元格,并且未调用didSelectRowAtIndexPath

时间:2016-05-23 18:33:22

标签: ios objective-c uitableview tableviewcell didselectrowatindexpath

我有一个NSArray和一个带有一些按钮的tableView,其标题是当前indexpath行中数组中的字符串

- (CustomCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexpath {

 _selectedRow = indexpath.row;
 static NSString *simpleTableIdentifier = @"customCell";
 cell = [myTableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

 if (cell == nil) {
  cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
 }

 [cell.playButton setTitle:array[indexpath.row] forState: UIControlStateNormal];

 return cell;

}

按钮标题很好显示。

现在我有一些mp3文件,其名称与数组中的字符串相同,我想播放与所选单元格对应的文件。

fileToPlay = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@", array[_selectedRow]]; ofType:@"mp3"];

这里发生的事情是播放的文件始终是与表格中最后一个可见单元格对应的文件。

我也有

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexpath {
 _selectedRow = indexpath.row;
}

但如果我尝试在此处打印_selectedRow,则日志中不会显示任何内容。

当我点击表格中的单元格时,它似乎没有被选中(它不是灰色的)。

dataSource和delegate也与tableview连接良好。

更新

我发现如果我点击按钮,就像我没有点击所选行一样。如果我单击单元格(按钮外),则indexPath.row是正确的。

3 个答案:

答案 0 :(得分:2)

cellForRowAtIndexPath方法中删除以下行。

 _selectedRow = indexpath.row;

每次调用_selectedRow时都会设置cellForRowAtIndexPath值,这是绘制每个单元格的时间,并解释为什么要删除最后一个单元格的值。

答案 1 :(得分:1)

设置代码:

 - (CustomCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexpath {
 cell.playButton.tag = indexpath.row;
[cell.playButton addTarget:self action:@selector(btnPlay:) forControlEvents:UIControlEventTouchUpInside];
}
- (IBAction)btnPlay:(id)sender{
    UIButton *btn = (UIButton *)sender;
    _selectedRow = btn.tag;
}

您可以选择触摸颜色组的选择颜色。 enter image description here

答案 2 :(得分:0)

试试这些:

1)将myGestureRecognizer.cancelsTouchInView设置为false ...也许你的接触正在进行中。 (当你可能有手势识别器时,这是一个常见的问题)

2)在tableView的属性检查器中,将“选择”设置为单例。这解决了我的问题

3)设置:[tableView setAllowsSelection:YES];