indexPath.row returns 最后一个可见单元格,并且未调用 didSelectRowAtIndexPath
indexPath.row returns last visible cell, and didSelectRowAtIndexPath not being called
我有一个 NSArray 和一个 table带有一些按钮的视图,它们的标题是数组中当前索引路径行中的字符串
- (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"];
这里发生的事情是播放的文件总是与 table 中最后一个可见单元格对应的文件。
我也有
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexpath {
_selectedRow = indexpath.row;
}
但是如果我尝试在此处打印 _selectedRow,则日志中不会出现任何内容。
当我点击 table 中的一个单元格时,它似乎没有被选中(它不是灰色的)。
dataSource 和 delegate 也很好地连接到 tableview。
更新
我发现如果我点击按钮,就好像我没有点击选定的行。如果我点击单元格(按钮外),indexPath.row 是正确的。
试试这些:
1) 将 myGestureRecognizer.cancelsTouchInView 设置为 false...也许您的触摸受到了阻碍。 (当你有手势识别器时,这是一个常见问题)
2) 在 tableView 的属性检查器中,将 Selection 设置为 singleton。这解决了我的问题
3) 设置:[tableView setAllowsSelection:YES];
从 cellForRowAtIndexPath
方法中删除以下行。
_selectedRow = indexpath.row;
您在每次调用 cellForRowAtIndexPath
时设置 _selectedRow
值,这是在绘制每个单元格时解释为什么要采用最后一个单元格的值。
设置代码:
- (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;
}
你是selectselection color for touch color set。
我有一个 NSArray 和一个 table带有一些按钮的视图,它们的标题是数组中当前索引路径行中的字符串
- (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"];
这里发生的事情是播放的文件总是与 table 中最后一个可见单元格对应的文件。
我也有
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexpath {
_selectedRow = indexpath.row;
}
但是如果我尝试在此处打印 _selectedRow,则日志中不会出现任何内容。
当我点击 table 中的一个单元格时,它似乎没有被选中(它不是灰色的)。
dataSource 和 delegate 也很好地连接到 tableview。
更新
我发现如果我点击按钮,就好像我没有点击选定的行。如果我点击单元格(按钮外),indexPath.row 是正确的。
试试这些:
1) 将 myGestureRecognizer.cancelsTouchInView 设置为 false...也许您的触摸受到了阻碍。 (当你有手势识别器时,这是一个常见问题)
2) 在 tableView 的属性检查器中,将 Selection 设置为 singleton。这解决了我的问题
3) 设置:[tableView setAllowsSelection:YES];
从 cellForRowAtIndexPath
方法中删除以下行。
_selectedRow = indexpath.row;
您在每次调用 cellForRowAtIndexPath
时设置 _selectedRow
值,这是在绘制每个单元格时解释为什么要采用最后一个单元格的值。
设置代码:
- (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;
}
你是selectselection color for touch color set。