1241

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

4

42 回答 42

2004

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

目标-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

或者

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

斯威夫特 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

斯威夫特 3 和 4.x:

cell.selectionStyle = .none

此外,请确保您要么不在-tableView:didSelectRowAtIndexPath:表格视图委托中实现,要么明确排除您希望在实现时不采取任何行动的单元格。

更多信息在这里这里

于 2008-10-10T13:22:04.480 回答
644

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

tableView.allowsSelection = false

这意味着didSelectRowAt#根本行不通。也就是说,触摸表格的一行,这样,绝对不会做任何事情。(因此,很明显,永远不会有选定的动画。)

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

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

tableView.allowsSelectionDuringEditing = false 
于 2009-07-22T16:56:19.283 回答
360

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



因此,根据您想要的逻辑和/或结果,实际上有 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
于 2011-06-10T11:08:35.577 回答
88

总结一下我认为基于我自己的实施经验的正确答案:

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

cell.userInteractionEnabled = NO;

除了防止选择之外,这还停止了 tableView:didSelectRowAtIndexPath: 被设置为单元格的调用。(此答案归功于 Tony Million,谢谢!)

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

并且您还需要忽略对- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.

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

tableView.allowsSelection = NO;

(感谢 Paulo De Barros,谢谢!)

于 2011-06-01T13:32:49.070 回答
58

从 iOS 6.0 开始,UITableViewDelegatetableView:shouldHighlightRowAtIndexPath:. (在 iOS文档中了解它。)

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

于 2012-10-31T21:48:47.593 回答
51

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

UITableView 检查器

于 2013-04-25T13:13:28.617 回答
47

SWIFT 3 的固定解决方案

cell.selectionStyle = .none
于 2017-01-07T19:15:36.313 回答
37

在Attribute InspectorUITableViewCellXIBSelection中将值设置为None

在此处输入图像描述

于 2016-10-05T07:49:18.870 回答
36

如果有人需要Swift的答案:

cell.selectionStyle = .None
于 2014-12-02T09:39:43.130 回答
35

如果你希望选择只闪烁,而不是保持在选中状态,你可以调用,在

didSelectRowAtIndexPath

以下

[tableView deselectRowAtIndexPath:indexPath animated:YES];

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

于 2012-11-13T15:07:34.103 回答
30

这就是我在cellForRowAtIndexPath编写这段代码时使用的:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
于 2015-03-30T10:31:58.313 回答
29

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

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

于 2009-06-30T10:01:20.427 回答
27

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


}
于 2015-03-30T06:10:18.293 回答
20

目标-C:

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

    self.tableView.allowsSelection = NO;
    
  2. 下面的代码段禁用突出显示,它不会禁用对didSelectRowAtIndexPath. 将单元格的选择样式设置为无cellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. 下面的代码段禁用单元格上的所有内容。这将禁用与buttons,的交互textfields

    self.tableView.userInteractionEnabled = false;
    

迅速:

以下是Swift上述解决方案的等价物Objective-C

  1. 更换第一种溶液

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

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

    self.tableView.userInteractionEnabled = false
    
于 2014-11-22T09:43:36.450 回答
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)
}
于 2011-05-27T15:37:39.243 回答
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;
}

这与将选择样式设置为无结合使用,因此单元格不会在触摸事件上闪烁

于 2013-01-03T21:08:48.237 回答
12

斯威夫特 3,4 和 5

更好的实践,编写代码UITableViewCell

例如,你有UITableViewCell名字MyCell,在awakeFromNib里面只写self.selectionStyle = .none

完整示例:

class MyCell: UITableViewCell {
    
    override func awakeFromNib() {
        super.awakeFromNib()
        self.selectionStyle = .none
    }
    
}
于 2020-08-10T07:44:29.617 回答
11

我们可以编写如下代码

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

但是当我们在上面有自定义单元格xib时,当时会发出警告

自定义单元格xib

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

于 2012-03-24T13:21:09.660 回答
11

您只需将此代码放入 cellForRowAtIndexPath

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

cell.selectionStyle = UITableViewCellSelectionStyle.None
于 2016-05-18T05:17:24.790 回答
10

试试这个

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

于 2012-07-09T07:27:18.230 回答
10

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

cell?.selectionStyle = UITableViewCellSelectionStyle.None
于 2015-10-19T12:33:39.543 回答
9

UITableViewDataSource协议,内部方法cellForRowAt添加:

let cell = tableView.dequeueReusableCell(withIdentifier: "YOUR_CELL_IDENTIFIER", for: indexPath)                
cell.selectionStyle = .none
return cell

或者

您可以转到 Storyboard > Select Cell > Identity Inspector > Selection 并从下拉列表中选择无。

于 2020-01-15T08:04:42.360 回答
7

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

我还想建议偶尔简短地显示该行已被选中然后将其关闭是有用的。这会提醒用户确认他们打算选择的内容:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
于 2013-08-20T21:25:24.857 回答
7

直接禁用 TableViewCell 突出显示到情节提要中

在此处输入图像描述

于 2018-04-13T21:33:56.790 回答
6

禁用 UItableviewcell 的突出显示

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

cell.userInteractionEnabled = NO;
于 2013-01-18T00:51:00.160 回答
6

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

您将使用如下代码:

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

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

于 2014-01-14T01:43:02.083 回答
6

您可以使用 :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

您也可以使用:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

在 tableview didselectrowatindexpath 方法中。

于 2014-07-12T09:06:08.803 回答
6

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

于 2014-12-04T05:12:56.677 回答
5

你可以用这个

cell.selectionStyle = UITableViewCellSelectionStyleNone;
于 2013-05-10T09:44:26.553 回答
5

最好的解决方案是使选择样式无

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

于 2013-08-25T13:24:40.017 回答
5

您可以使用 ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
于 2013-10-08T11:10:34.393 回答
5
cell.selectionStyle = UITableViewCellSelectionStyleNone;
于 2014-04-10T12:08:13.993 回答
5
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

编码快乐!!!

于 2014-07-31T12:53:24.953 回答
5

带有自定义单元的快速解决方案:

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
  } 
}
于 2015-02-19T08:54:28.990 回答
5

您可以使用UITableViewCell 的selectionStyle属性

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

或者

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

另外,不要在委托下面实现

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

如果您已经创建了 Xib/Storyboard 文件,那么您可以通过取消选中它来将 tableview 的setUserInteractionEnabled 属性更改为No。这将使您的表格视图为只读。

于 2015-05-15T08:55:20.127 回答
3

您可以使用 (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


}
于 2018-09-14T09:16:47.347 回答
3

禁用 UITableView 中所有 UITableViewCells 的选择

tableView.allowsSelection = false

禁用特定 UITableViewCells 的选择

cell.selectionStyle = UITableViewCell.SelectionStyle.none
于 2020-10-21T11:02:04.007 回答
2

更好的方法是:

cell.userInteractionEnabled = NO;

这种方法不会调用didSelectRowAtIndexPath:方法。

于 2012-12-17T07:36:11.000 回答
2

至少从 iOS 6 开始,您可以覆盖自定义单元格中的方法以防止蓝色突出显示。没有其他交互被禁用或影响。这三个都必须被覆盖。

- (void) setHighlighted:(BOOL)highlighted
{
}

- (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
}

- (void) setSelected:(BOOL)selected animated:(BOOL)animated
{
}
于 2013-04-25T12:33:27.327 回答
1

情景 - 1

如果您不想选择tableview上的某些特定单元格,您可以在cellForRow函数中为这些单元格设置选择样式。

Objective-C

cell.selectionStyle = UITableViewCellSelectionStyleNone;

斯威夫特 4.2

cell.selectionStyle = .none

情景 - 2

要禁用整个表视图上的选择:

Objective-C

self.tableView.allowsSelection = false;

斯威夫特 4.2

self.tableView.allowsSelection = false
于 2019-07-25T07:42:42.570 回答
1

很简单的东西。在返回 tableview Cell 之前,使用 table view cell 的 style 属性。

只需在返回表格视图单元格之前编写这行代码
cell.selectionStyle = .none

于 2019-07-30T07:35:00.823 回答
0

我已经完成了所有答案,对我的用例有用的是以下内容:

tableView.allowSelection = false
public func tableView(_ tableView: UITableView, canFocusRowAt indexPath: IndexPath) -> Bool {
    true
}

这样表格仍然可以聚焦,用户可以滚动其元素但无法“按下/选择”它们。

简单的设置cell.selectionStyle = .none将允许列表元素是可选的(只是不要留下灰色的选择标记)。只是设置allowSelection = false会导致我的桌子无法聚焦。用户将无法滚动浏览元素。

于 2021-06-15T10:10:48.787 回答