如何禁用UITableView选择?


1192

当您点击中的一行时UITableView,该行将突出显示并选中。是否可以禁用此功能,所以点击一行不会执行任何操作?


17
原始问题的标题不正确。OP主要要禁用selection,当然要highlighting禁用它。许多投票赞成的答案解释了如何disable selection以及不解决残疾问题highlighting。要仅禁用突出显示,请使用cell.selectionStyle = .None或转到storyboard / cell / Selection = None
Andrej'9

请更新标题或帖子。我糊涂了。基于这个问题,我不知道所提供的答案是做什么的。
丹尼尔·斯普林格

Answers:


603

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

tableView.allowsSelection = false

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

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

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

tableView.allowsSelectionDuringEditing = false 

6
这最终对我有用,我尝试使用cell.selectionStyle = UITableViewCellSelectionStyleNone; 但这没用。需要注意的一件事:应该是:tableView.allowsSelection = NO; 不假。
tony.tc.leung 2010年

6
我认为,这是最好的选择。单元格上的按钮与此同时处于活动状态,但文本不处于活动状态。
Fahim Parkar

513
这是如何被接受的答案,并且有这么多的赞成票?它根本无法回答问题!您需要selectionStyle在单元格上设置属性:cell.selectionStyle = UITableViewCellSelectionStyle.None在Swift或cell.selectionStyle = UITableViewCellSelectionStyleNoneObjective-C中。
nodebase

5
这对我的作品中迅速2tableView.allowSelection = false
Khanad

15
有几种方法可以执行此操作,具体取决于所需的内容。没有选择样式,没有选择都可以起作用,或者都可以失败。这是一个例子。如果要选择单元格并tableViewDidSelectRowAtIndexPath要调用它,cell.selectionStyle = .None则是需要的。如果您不希望或不希望调用该委托函数(即,在tableViewCell中具有文本字段),则设置tableView.allowsSelection = false就可以了。
Made2k '16

1963

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

目标C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

要么

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

斯威夫特2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3和4.x:

cell.selectionStyle = .none

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

在这里这里更多信息


122
@Tony如果单元格中有UITextField,那是个坏主意。
Aniruddh Joshi

73
@TonyMillion如果您要使用内置的编辑控件(如滑动到删除),这也不是一个好主意。如果将userInteractionEnabled设置为NO,则删除按钮将不响应用户触摸事件。
卡洛斯·P

47
在此线程后面,但不要使用userInteraction,请使用cell.allowsSelection。这将停止单元格的交互方法,但不会阻止常规的UIView响应器。
克里斯·C

4
设置cell.userInteractionEnable = No不会停止触发didSelectRowAtIndexPath。
user4951 2012年

25
我将对答案进行表决,但要明确一点,OP仅要求禁用“突出显示”,而没有要求禁用整个单元格交互,因此所有这些评论都是不合时宜的。
Frederic YesidPeñaSánchez2014年

353

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



因此,实际上有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

3
如果从笔尖加载单元设计,则复选框(在IB中)对#3(在#4的表上)将正常工作。对于#4与#2,单元内的控件是否将是交互式的区别在于?
lilbyrdie 2011年

4
是。如果要禁用选择但允许UIButtons等继续支持用户交互,请使用#2。如果您想要一个完全只读的单元格,请使用#4。当然,为什么在非交互式单元格中除了UIViews或UILabel之外,什么也不是。也许有人想在发生其他事情时禁用所有交互。
mbm29414 2011年

8
#4是一个糟糕的主意,这样做也会禁用表格视图中的滚动
simon 2014年

4
@simon其实,这不是一个糟糕的主意。根据您的具体情况,这可能不是一个好的选择。另外,#4禁用USER滚动;您仍然可以根据需要实施自己的方法。我同意#4不是很有用,但这不是一个糟糕的主意。
mbm29414 2014年

3
为了完整起见,请为添加一个喊叫声tableView:shouldHighlightRowAtIndexPath:,这通常(并非总是)是我的首选方法。
约翰·

81

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

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

cell.userInteractionEnabled = NO;

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

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

tableView.allowsSelection = NO;

(感谢Paulo De Barros,谢谢!)


如果我们的单元格中有一个按钮怎么办?
Umair Afzal

56

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

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


2
偶然发现了这个线程,在此之前,我看到如此多的其他答案感到震惊。毫无疑问,这是正确的方法。
beebcon's

2
这确实是应该考虑的正确且唯一的答案。提到userInteraction的其他所有内容都是完全错误的。
mattyohe

50

您还可以通过NoSelectionselection检查器窗格的(UITableView属性的)选项中进行选择,来禁用从界面生成器本身进行的行选择,如下图所示。

UITableView检查器


2
最好的解决方案恕我直言
Itai Spector

我经常使用此解决方案
Evsenev


36

在您UITableViewCellXIB中的“属性检查器”中将的值设置SelectionNone

在此处输入图片说明


这正是我所需要的。我仍然想要didSelect ...通知,但是没有可见的选择指示。谢谢!
蒂莫西·特里普

很高兴它有所帮助!:)
Zaid Pathan '01

35

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

didSelectRowAtIndexPath

以下

[tableView deselectRowAtIndexPath:indexPath animated:YES];

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


3
使用这种方法,该行立即突出显示,然后在半秒内消失。这是Apple设置“设置”菜单样式的方式,因此对我来说看起来不错。
VinceFior

34

万一有人需要Swift的答案:

cell.selectionStyle = .None

1
我们也可以使用此cell.selectionStyle = UITableViewCellSelectionStyle.None
可能


28

UITableViewDelegate协议中,您可以使用方法willSelectRowAtIndexPathreturn nil如果您不想选择该行。

以相同的方式,您可以使用willDeselectRowAtIndexPath方法,return nil如果您不希望取消选择该行。


5
我不喜欢这种方法,因为在触摸之前,它仍然以突出显示的状态显示单元格。
kbanman

2
这正是我喜欢它的原因:-)
Joris Weimar

24

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


目标C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

要么

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


斯威夫特2:

cell.selectionStyle = UITableViewCellSelectionStyle.None


斯威夫特3:

cell.selectionStyle = .none


2-请勿实施- tableView:didSelectRowAtIndexPath:在表格视图中delegate或明确排除要执行的操作而无需执行任何操作的单元格。

3-此外,您还可以从情节提要中进行操作。单击表视图单元格,然后在“表视图单元格”下的属性检查器中,将“选择”旁边的下拉列表更改为“无”。


4-您可以使用(iOS)Xcode 9,Swift 4.0中的以下代码禁用表格单元格突出显示

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
        cell.selectionStyle = .none
        return cell


}

20

目标C:

  1. 摘录下方的代码段禁用了突出显示功能,但也禁用了对的调用didSelectRowAtIndexPath。因此,如果您未实现,请didSelectRowAtIndexPath使用以下方法。在创建表时应添加它。不过,这将适用于按钮和UITextField单元格内部。

    self.tableView.allowsSelection = NO;
  2. 摘录下方的代码段禁用突出显示功能,并且不会禁用对的调用didSelectRowAtIndexPath。在以下位置将单元格的选择样式设置为“无”cellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
  3. 在摘要下方,禁用单元格上的所有内容。这将禁用互动buttonstextfields

    self.tableView.userInteractionEnabled = false;

迅速:

以下是Swift上述Objective-C解决方案的等效项:

  1. 替换第一个解决方案

    self.tableView.allowsSelection = false
  2. 替代第二种解决方案

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
  3. 替代第三种解决方案

    self.tableView.userInteractionEnabled = false

19

尝试输入:

cell.selected = NO;

需要时,它将取消选择您的行。

在Swift3中...

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

14

我也一直在为此作斗争,控制我UITableViewCell禁止使用userInteractionEnabled财产。我有一个用于设置的3单元格静态表格,其中2个带有日期,1个带有开/关开关。在Storyboard / IB中玩过之后,我设法使底部的一个不可选择,但是当您点击它时,顶部之一的选择就消失了。这是我的设置UITableView的WIP图像:

设置UITableView

如果您点击第三行,则什么也没有发生,选择将保留在第二行。该功能实际上是Apple日历应用程序的添加事件时间选择屏幕的副本。

该代码令人惊讶地兼容,一直到IOS2 = /:

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

这与将选择样式设置为none一起工作,因此单元格不会在触地事件时闪烁


11

我们可以像这样写代码

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

但是,当我们自定义单元格厦门国际银行上述行给予警告当时的

自定义单元XIB

我们需要在界面构建器中设置选择样式None


11

您只需要将此代码放入cellForRowAtIndexPath

禁用单元格的选择属性:(同时轻击单元格)。

cell.selectionStyle = UITableViewCellSelectionStyle.None

谢谢,我的手机中有一张图片,上面有一个标签。我已经设置了标签背景,但是每次单击背景都会消失,这已经解决了。
达科

10

尝试这个

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

您还可以使用interfacebuilder设置选择样式。



7

虽然这是防止行在选择过程中显示突出显示的最佳和最简单的解决方案

cell.selectionStyle = UITableViewCellSelectionStyleNone;

我还想建议偶尔显示一下已选中该行然后将其关闭的方法有时会很有用。这会向用户发出警告,告知他们要选择的内容:

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


6

禁用突出显示UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

并且不应允许用户与单元交互。

cell.userInteractionEnabled = NO;

6

UITableViewCellSelectionStyleNone如果您不想/不能使用,您还可以将背景颜色设置为“透明”以达到与相同的效果UITableViewCellSelectionStyleNone

您将使用如下代码:

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

当您向每个单元格添加额外的彩色视图时,这可能会降低性能。


6

您可以使用 :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

在UITableView的索引路径方法中的行单元格中。

您也可以使用:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

在tableview中的didselectrowatindexpath方法。


现在cell.selectionStyle = UITableViewCellSelectionStyle.none
丹,

5

你可以用这个

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5

您可以使用 ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];



5

您也可以从情节提要中进行操作。单击表视图单元格,然后在“表视图单元格”下的属性检查器中,将“选择”旁边的下拉列表更改为“无”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.