协慌网

登录 贡献 社区

如何禁用 UITableView 选择?

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

答案

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

Objective-C 的:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

要么

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

斯威夫特 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3 和 4.x:

cell.selectionStyle = .none

此外,请确保您未在表视图委托中实现-tableView:didSelectRowAtIndexPath:或明确排除您希望在没有操作的情况下执行它的单元格。

更多信息在这里这里

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

tableView.allowsSelection = NO;

这意味着didSelectRowAt#根本不起作用。也就是说,触摸桌子的一排,就这样,绝对不会做任何事情。 (因此,显然,永远不会有选定的动画。)

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

因为我最近阅读了这篇文章,它帮助了我,我想发布另一个答案来巩固所有的答案(后代)。



因此,根据您所需的逻辑和 / 或结果,实际上有 5 种不同的答案:

1. 要禁用蓝色突出显示而不更改单元格的任何其他交互:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

当我在 UITutViewCell 中托管 UIButton 或其他控件时,我使用它,我希望用户能够与控件交互,但不能与单元本身交互。

注意 :正如 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