UITableView点击以取消选择单元格

Pau*_*nge 19 iphone uitableview ios

点击时我UITableViewCell选择了一个.在此选定状态期间,如果用户再次点击该单元格,我希望该单元格取消选择.

我找不到任何被调用的委托调用.任何想法如何实现这一点?它真的会成为手势识别器吗?

pri*_*ohn 33

您实际上可以使用委托方法执行此操作 willSelectRowAtIndexPath:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if ([cell isSelected]) {
        // Deselect manually.
        [tableView.delegate tableView:tableView willDeselectRowAtIndexPath:indexPath];
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        [tableView.delegate tableView:tableView didDeselectRowAtIndexPath:indexPath];

        return nil;
    }

    return indexPath;
}
Run Code Online (Sandbox Code Playgroud)

请注意,deselectRowAtIndexPath:不会自动调用委托方法,因此您需要手动进行这些调用.

  • 请注意,在调用方法之前,应始终检查委托是否响应选择器. (9认同)

Mat*_*aga 21

在Swift 4中:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {

    if let indexPathForSelectedRow = tableView.indexPathForSelectedRow,
        indexPathForSelectedRow == indexPath {
        tableView.deselectRow(at: indexPath, animated: false)
        return nil
    }
    return indexPath
}
Run Code Online (Sandbox Code Playgroud)


ata*_*boo 5

使用“多选”模式时,单击已选择的行将不会调用“ didSelectRowAtIndexPath”。在“单选”模式下,仍然可以通过编程方式选择多于一行,并且这些行将在所有点击时触发didSelectRowAtIndexPath。

遇到任何相同问题的人,请注意。


Pau*_*nge -4

也许我的问题不够具体,但这两个答案有点超出了我的要求。

看来这是不可能的,我使用单元格的手势识别器来手动设置选定/未选定状态。

  • 这绝对是可能的,请更改为 @prisonerjohn 的答案作为正确的答案,因为它正是您的问题所描述的。 (3认同)