如何禁用 UITableView 选择?

当您点击UITableView中的一行时,该行将突出显示并选中。是否可以禁用此功能,所以点击一行什么都不做?

答案

您要做的就是使用以下任一方法在UITableViewCell实例上设置选择样式:

目标 C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

要么

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

斯威夫特 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3 和 4.x:

cell.selectionStyle = .none

此外,请确保您没有在表视图委托中实现-tableView:didSelectRowAtIndexPath:或者明确排除了您希望对其执行任何操作的单元格。

在这里这里 更多信息

对我来说,以下工作正常:

tableView.allowsSelection = false

这意味着didSelectRowAt#根本无法工作。就是说,如此触摸桌子的一行绝对不会做任何事情。 (因此,显然,绝不会有选定的动画。)

(请注意,如果在单元格上有UIButton或任何其他控件,那么这些控件当然仍然可以使用。您碰巧在表单元格上拥有的任何控件都与 UITableView 允许您 “选择行” 的能力完全无关。 “使用didSelectRowAt# 。)

还要注意的另一点是:当UITableView处于编辑模式时,这不起作用。要在编辑模式下限制单元格的选择,请使用以下代码:

tableView.allowsSelectionDuringEditing = false

因为我最近阅读了这篇文章,并且对我有帮助,所以我想发布另一个答案以合并所有答案(以供后代使用)。



因此,实际上有 5 个不同的答案,具体取决于您所需的逻辑和 / 或结果:

1. 要禁用蓝色突出显示而不更改单元格的任何其他交互,请执行以下操作:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

当我有一个 UIButton - 或其他一些控件 - 托管在 UITableViewCell 中并且希望用户能够与控件(而非单元格本身)进行交互时,可以使用此控件。

注意 :如上文 Tony Million 所述,这不会阻止tableView:didSelectRowAtIndexPath:我通过简单的 “if” 语句来解决这个问题,大多数情况下是对该部分进行测试,并避免对特定部分采取措施。

我想到的另一种测试像这样的单元窃听的方法是:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // A case was selected, so push into the CaseDetailViewController
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
        // Handle tap code here
    }
}



2. 要对整个表执行此操作,可以将上述解决方案应用于表中的每个单元格,但是您也可以执行以下操作:

[tableView setAllowsSelection:NO];

在我的测试中,这仍然允许UITableViewCell内部的控件是交互式的。


3. 要将单元格设置为 “只读”,只需执行以下操作:

[cell setUserInteractionEnabled:NO];



4. 使整个表为 “只读”

[tableView setUserInteractionEnabled:NO];



5,要即时确定是否突出显示一个单元格(根据此答案隐式包含选择),可以实现以下UITableViewDelegate协议方法:

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath

根据我自己的实现经验,总结一下我认为是正确的答案:

如果要仅禁用某些单元格的选择,请使用:

cell.userInteractionEnabled = NO;

除了阻止选择之外,这还会停止为设置了该参数的单元格调用 tableView:didSelectRowAtIndexPath:。 (感谢托尼 · 百万,谢谢!)

如果您的单元格中有需要单击的按钮,则需要改为:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

并且还需要忽略对- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath单元格的任何单击。

如果要禁用整个表的选择,请使用:

tableView.allowsSelection = NO;

(感谢 Paulo De Barros,谢谢!)

从 iOS 6.0 开始, UITableViewDelegate具有tableView:shouldHighlightRowAtIndexPath: (有关详细信息,请参阅 iOS 文档 。)

此方法使您可以将特定行标记为不可突出显示(并且隐式地,不可选择),而不必更改单元格的选择样式,使用userInteractionEnabled = NO或此处记录的任何其他技术来弄乱单元格的事件处理。

您还可以通过从检查器窗格的(UITableView 属性的) selection选项中选择NoSelection来从界面构建器本身禁用对行的selection ,如下图所示

UITableView检查器

SWIFT 3 的固定解决方案

cell.selectionStyle = .none

如果您希望选择仅闪烁而不是保持选定状态,则可以在

didSelectRowAtIndexPath

下列

[tableView deselectRowAtIndexPath:indexPath animated:YES];

因此它将闪烁所选状态并还原。

万一有人需要Swift 的答案:

cell.selectionStyle = .None

UITableViewCellXIB中,将 “属性检查器” 的Selection值设置为None

在此处输入图片说明