如何禁用UITableView选择?

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

524340 次浏览

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

Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3和4. x:

cell.selectionStyle = .none

此外,请确保您没有在表视图委托中实现-tableView:didSelectRowAtIndexPath:,或者显式排除您希望在实现它时没有操作的单元格。

更多信息在这里这里

UITableViewDelegate协议中,您可以使用方法willSelectRowAtIndexPath如果您不想选择该行,则为0。

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

对我来说,以下工作很好:

tableView.allowsSelection = false

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

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

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

tableView.allowsSelectionDuringEditing = false

尝试键入:

cell.selected = NO;

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

在Swift3…

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

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

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

cell.userInteractionEnabled = NO;

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

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

tableView.allowsSelection = NO;

(归功于Paulo De Barros,谢谢!)

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



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

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

注意:正如Tony Million在上面所指出的,这并不能阻止tableView:didSelectRowAtIndexPath:。我通过简单的“if”语句来解决这个问题,最常见的是测试该部分并避免对特定部分采取行动。

我想到的另一种测试这样的细胞的方法是:

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



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

[tableView setAllowsSelection:NO];

在我的测试中,这仍然允许#0中的控件是交互式的。


3.要使单元格“只读”,您可以简单地这样做:

[cell setUserInteractionEnabled:NO];



4.将整个表设置为只读

[tableView setUserInteractionEnabled:NO];



5.要动态确定是否突出显示单元格(根据这个答案隐含包括选择),您可以实现以下UITableViewDelegate协议方法:

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

我们可以编写类似

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

但是当我们有自定义单元格xib发出警告行之上时

自定义单元格xib

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

试试这个

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

从iOS6.0开始,UITableViewDelegatetableView:shouldHighlightRowAtIndexPath:。(在iOS需求文档中阅读。)

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

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

didSelectRowAtIndexPath

以下

[tableView deselectRowAtIndexPath:indexPath animated:YES];

因此,它将闪烁选定的状态并恢复。

更好的方法是:

cell.userInteractionEnabled = NO;

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

我也一直在与此作斗争,在我的UITableViewCell中有一个控件禁止使用userInteractionEnabled属性。我有一个用于设置的3个单元格静态表,2个带有日期,1个带有开/关开关。在Storyboard/IB中播放后,我设法使底部的一个不可选择,但是当你点击它时,顶部一行的选择消失了。这是我的设置UITableView的进展中的图像:

UITableView

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

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

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

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

禁用UItableviewcell的突出显示

cell.selectionStyle = UITableViewCellSelectionStyleNone;

并且不应该允许用户与小区交互。

cell.userInteractionEnabled = NO;

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

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

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

UITableView检查器

你可以用这个

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

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

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

您可以使用…

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

您将使用如下代码:

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

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

您可以使用:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

您也可以使用:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

在tableview didselectrowatindextath方法中。

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

编码愉快!!!

Objective-C:

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

    self.tableView.allowsSelection = NO;
  2. Below snippet disable highlighting and it doesn't disable the call to didSelectRowAtIndexPath. Set the selection style of cell to None in cellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
  3. Below snippet disable everything on the cell. This will disable the interaction to buttons, textfields:

    self.tableView.userInteractionEnabled = false;

Swift:

Below are the Swift equivalent of above Objective-C solutions:

  1. Replacement of First Solution

    self.tableView.allowsSelection = false
  2. Replacement of Second Solution

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
  3. Replacement of Third Solution

    self.tableView.userInteractionEnabled = false

编辑:对于较新的Swift,更改为:

cell.selectionStyle = .none

查看更多信息:https://developer.apple.com/documentation/uikit/uitableviewcell/selectionstyle

如果有人需要答案Swift

cell.selectionStyle = .None

您也可以在故事板中执行此操作。单击表格视图单元格并在表格视图单元格下的属性检查器中,将选择旁边的下拉列表更改为无。

使用自定义单元的Swift解决方案:

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}}

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


目标-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None


Swift 3:

cell.selectionStyle = .none


2-不要在表视图delegate中实现-#0,或者显式排除您希望在实现时没有操作的单元格。

3-此外,您也可以从故事板执行此操作。单击表格视图单元格并在表格视图单元格下的属性检查器中,将选择旁边的下拉列表更改为无。


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

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

let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCellcell.selectionStyle = .nonereturn cell

}

这就是我用的,在cellForRowAtIndexPath中写这段代码。:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

您可以使用UITableViewCell的选择样式属性

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

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

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

cell?.selectionStyle = UITableViewCellSelectionStyle.None

你只需要将此代码放入cell ForRowAtIndexPath

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

cell.selectionStyle = UITableViewCellSelectionStyle.None

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

在此处输入图片描述

SWIFT 3的固定解决方案

cell.selectionStyle = .none

直接在故事板中禁用TableViewCell的高亮

在此处输入图片描述

您可以使用(iOS)Xcode 9,Swift 4.0中的以下代码禁用表格单元格高度

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

let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCellcell.selectionStyle = .nonereturn cell

}

场景1

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

Objective-c

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Swift4.2

cell.selectionStyle = .none

场景2

对于禁用整个表格视图上的选择:

Objective-c

self.tableView.allowsSelection = false;

Swift4.2

self.tableView.allowsSelection = false

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

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

U IT能够查看数据源协议,在方法cellForRowAt中添加:

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

您可以转到故事板>选择单元格>身份检查器>选择并从下拉列表中选择无。

Swift 3,4和5

,在UITableViewCell中编写代码

例如,您有UITableViewCell与名称MyCell,在awakeFromNib中只写self.selectionStyle = .none

完整示例:

class MyCell: UITableViewCell {    
override func awakeFromNib() {super.awakeFromNib()self.selectionStyle = .none}    
}

在UITableView中禁用所有UITableViewCell的选择

tableView.allowsSelection = false

禁用特定UITableViewCell的选择

cell.selectionStyle = UITableViewCell.SelectionStyle.none

我已经浏览了所有答案,对我的用例有效的是以下内容:

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

通过这种方式,表保持可聚焦,用户可以滚动其元素,但无法“按下/选择”它们。

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