我怎样才能禁用UITableViewselect突出显示?

当您在UITableView点击一行时,该行将突出显示并被选中。 是否可以禁用这个,所以点击一个行什么也不做?

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

tableView.allowsSelection = NO;

这意味着didSelectRowAt#根本不会工作。 也就是说,触摸一排桌子,这样做绝对没有什么。 (因此,显然不会有selectanimation。)

(请注意,如果在单元格上有UIButton或任何其他控件,当然这些控件仍然可以工作。任何在表格单元格中碰巧有的控件都与UITableView允许你“select一行“使用didSelectRowAt# 。)

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

Objective-C的:

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

要么

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

Swift 2:

 cell.selectionStyle = UITableViewCellSelectionStyle.None 

Swift 3:

 cell.selectionStyle = .none 

此外,请确保您不要在表视图委托中实现-tableView:didSelectRowAtIndexPath:或者如果您实施它,请明确排除您希望没有操作的单元。

更多信息在这里和这里

因为最近我读过这篇文章,对我有所帮助,所以我想发表另外一个答案来巩固所有的答案(后人)。


所以,实际上有5个不同的答案取决于你想要的逻辑和/或结果:

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

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

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

注意 :正如Tony Million上面指出的,这不会阻止tableView:didSelectRowAtIndexPath: 我通过简单的“if”语句来解决这个问题,大多数情况下都是针对该部分进行testing,并避免针对特定部分的操作。

我想testing像这样的单元格的另一种方法是:

 - (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.要对整个表格执行此操作,可以将上述解决scheme应用于表格中的每个单元格,但是也可以这样做:

 [tableView setAllowsSelection:NO]; 

在我的testing中,这仍然允许UITableViewCell控件是交互式的。

3.要使单元格为“只读”,您可以简单地执行此操作:

 [cell setUserInteractionEnabled:NO]; 

4.要将整个表格设置为“只读”

 [tableView setUserInteractionEnabled:NO]; 

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

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

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

如果您想禁用某些单元格的select,请使用:

 cell.userInteractionEnabled = NO; 

除了防止select,这也停止tableView:didSelectRowAtIndexPath:被设置的单元格被调用。 (感谢Tony Million这个答案,谢谢!)

如果在单元格中有需要点击的button,则需要改为:

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

你也需要忽略在单元格中的任何点击- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

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

 tableView.allowsSelection = NO; 

(感谢Paulo De Barros,谢谢!)

从iOS 6.0开始, UITableViewDelegate具有tableView:shouldHighlightRowAtIndexPath: (请阅读iOS 文档 。)

此方法允许您将特定行标记为unhighlightable(隐式,不可选),而不必更改单元格的select样式,与userInteractionEnabled = NO的单元格事件处理混淆,或者logging此处的任何其他技术。

您还可以通过在检查器窗格中的selection选项(UITableView属性)中selectNoSelection来禁止从界面生成器本身中select行,如下图所示

UITableView检查器

如果有人需要回答Swift :

 cell.selectionStyle = .None 

SWIFT的固定解决scheme3

 cell.selectionStyle = .none 

如果你想select只闪光,不保持在选定的状态,你可以调用,在

 didSelectRowAtIndexPath 

下列

 [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

所以它会闪烁选中状态并恢复。

UITableViewDelegate协议,你可以使用方法willSelectRowAtIndexPath ,如果你不想select的行, return nil

以相同的方式,您可以使用willDeselectRowAtIndexPath方法,如果不想取消select该行,则return nil

这是我使用的:

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

在cellForRowAtIndexPath中写这个代码。

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

在这里输入图像描述

尝试input:

 cell.selected = NO; 

它将在需要时取消select你的​​行。

在Swift3中…

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let r = indexPath.row print("clicked .. \(r)") tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true) } 

我一直在与这非常丰富的战斗,在我的UITableViewCell控制禁止使用userInteractionEnabled属性。 我有一个3格静态表的设置,2date,1与开/关开关。 在Storyboard / IB中播放后,我已经设法让底部的一个不可选,但是当您点击它时,顶部行之一的select消失。 这里是我的设置UITableView的WIP图像:

设置UITableView

如果你点击第三排没有任何事情发生,select将停留在第二排。 该function实际上是苹果的日历应用程序的添加事件时间select屏幕的副本。

代码出奇的兼容,一直到IOS2 = /:

 - (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == 2) { return nil; } return indexPath; } 

这与将select样式设置为无关联,因此单元格不会在触发事件中闪烁

迅速取消

 cell.selectionStyle = .None 

目标C:

  1. 在代码片断禁用突出显示,但它也禁用了对didSelectRowAtIndexPath的调用。 所以如果你没有实现didSelectRowAtIndexPath然后使用下面的方法。 这应该在创build表时添加。 这将在单元格内的button和TextField上工作。

     self.tableView.allowsSelection = NO; 
  2. 在代码片断禁用突出显示,并且不会禁用对didSelectRowAtIndexPath的调用。 在cellForRowAtIndexPath中将单元格的select样式设置为None

     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
  3. 在代码片段下面禁用单元格中的所有内容。 这将禁用与button,文本框的交互:

     self.tableView.userInteractionEnabled = false; 

迅速

以下是上述Objective-C解决scheme的Swift等价物:

  1. 第一个解决scheme的替代

     self.tableView.allowsSelection = false 
  2. 更换第二个解决scheme

     cell?.selectionStyle = UITableViewCellSelectionStyle.None 
  3. 第三种解决scheme的替代

     self.tableView.userInteractionEnabled = false 

你只需要把这个代码放到cellForRowAtIndexPath中

禁用单元格的select属性:(点击单元格时)。

 cell.selectionStyle = UITableViewCellSelectionStyle.None 

我们可以编写像

  cell.selectionStyle = UITableViewCellSelectionStyleNone; 

但是当我们在上面定制单元xib的时候给出警告

自定义单元格xib

我们需要从界面生成器中设置select样式None

尝试这个

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

也可以使用interfacebuilder设置select风格。

我正在使用这个,这对我很有用。

 cell?.selectionStyle = UITableViewCellSelectionStyle.None 

虽然这是最好的和最简单的解决scheme,以防止行在select过程中显示高亮显示

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

我还想build议偶尔有用的是简要地表明该行已被选中然后closures。 这提醒用户确认他们打算select什么:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:NO]; ... } 

你也可以设置背景颜色为Clear,以达到与UITableViewCellSelectionStyleNone相同的效果,如果你不想/不能使用UITableViewCellSelectionStyleNone

你会使用如下代码:

 UIView *backgroundColorView = [[UIView alloc] init]; backgroundColorView.backgroundColor = [UIColor clearColor]; backgroundColorView.layer.masksToBounds = YES; [cell setSelectedBackgroundView: backgroundColorView]; 

这可能会降低您的性能,因为您为每个单元添加一个额外的彩色视图。

禁用UItableViewcell的高亮显示

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

而且不应该让用户与单元进行交互。

 cell.userInteractionEnabled = NO; 

你可以使用这个

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

您可以使用 ….

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
 UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; [cell setSelected:NO animated:NO]; [cell setHighlighted:NO animated:NO]; 

快乐编码!

你也可以从故事板中完成。 单击表格视图单元格,然后在表格视图单元格下的属性检查器中,将select旁边的下拉列表更改为无。

Swift解决schemew /自定义单元格:

 import Foundation class CustomTableViewCell: UITableViewCell { required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) self.selectionStyle = UITableViewCellSelectionStyle.None } } 

你可以使用UITableViewCell的selectionStyle属性

  cell.selectionStyle = UITableViewCellSelectionStyleNone; 

要么

  [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

另外,不要实现下面的代表

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... } 

如果您创build了Xib / Storyboard文件,那么您可以通过取消选中将tableview的setUserInteractionEnabled属性更改为No。 这将使你的tableview只读。

最好的解决scheme是做select风格无

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

但是,在这里,我们正在考虑的事实是,没有用于选定状态的自定义图像。