如何禁用UITableView选择?

时间:2008-10-10 11:32:28

标签: ios uitableview cocoa-touch

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

42 个答案:

答案 0 :(得分:1913)

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

目标-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

斯威夫特2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3和4.x:

cell.selectionStyle = .none

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

More info herehere

答案 1 :(得分:550)

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

tableView.allowsSelection = NO;

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

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

答案 2 :(得分:351)

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



因此,根据您所需的逻辑和/或结果,实际上有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.要在运行中确定是否突出显示一个单元格(根据this answer隐式包含选择),您可以实现以下UITableViewDelegate协议方法:

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

答案 3 :(得分:82)

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

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

cell.userInteractionEnabled = NO;

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

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

tableView.allowsSelection = NO;

(感谢Paulo De Barros,谢谢!)

答案 4 :(得分:54)

从iOS 6.0开始,UITableViewDelegatetableView:shouldHighlightRowAtIndexPath:。 (在iOS Documentation中阅读。)

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

答案 5 :(得分:48)

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

UITableView Inspector

答案 6 :(得分:45)

SWIFT 3的固定解决方案

cell.selectionStyle = .none

答案 7 :(得分:34)

如果有人需要回答Swift

cell.selectionStyle = .None

答案 8 :(得分:34)

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

中调用
didSelectRowAtIndexPath

以下

[tableView deselectRowAtIndexPath:indexPath animated:YES];

因此它将闪烁所选状态并恢复。

答案 9 :(得分:32)

UITableViewCell XIB 的属性检查器设置值SelectionNone

enter image description here

答案 10 :(得分:29)

这是我在cellForRowAtIndexPath编写此代码时使用的内容。:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

答案 11 :(得分:28)

UITableViewDelegate协议,您可以使用方法willSelectRowAtIndexPath 如果您不想选中该行,请return nil

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

答案 12 :(得分:20)

目标C:

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

    self.tableView.allowsSelection = NO;
    
  2. 在代码段下方禁用突出显示,并且它不会禁用对didSelectRowAtIndexPath的调用。在cellForRowAtIndexPath

    中将单元格的选择样式设置为无
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. 在代码段下面禁用单元格上的所有内容。这会停止与buttonstextfields

    的互动
    self.tableView.userInteractionEnabled = false;
    
  4. 夫特:

    以下Swift相当于以上Objective-C解决方案:

    1. 更换第一个解决方案

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

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

      self.tableView.userInteractionEnabled = false
      

答案 13 :(得分: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 :(得分:18)

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


目标C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


Swift 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


}

答案 15 :(得分:14)

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

Settings UITableView

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

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

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

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

答案 16 :(得分:11)

您只需将此代码放入cellForRowAtIndexPath

即可

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

cell.selectionStyle = UITableViewCellSelectionStyle.None

答案 17 :(得分:11)

我们可以编写像

这样的代码
 cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

自定义单元格xib

我们需要从界面构建器

设置选择样式无

答案 18 :(得分:10)

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

cell?.selectionStyle = UITableViewCellSelectionStyle.None

答案 19 :(得分:10)

试试这个

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

答案 20 :(得分:7)

UITableViewDataSource 协议的方法cellForRowAt内添加:

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

OR

您可以转到情节提要>选择单元格> Identity Inspector>选择,然后从下拉列表中选择任何一个。

答案 21 :(得分:7)

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

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

答案 22 :(得分:6)

直接禁用TableViewCell突出显示到故事板

enter image description here

答案 23 :(得分:6)

您可以使用:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

您也可以使用:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

在tableview didselectrowatindexpath方法。

答案 24 :(得分:6)

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

您可以使用以下代码:

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

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

答案 25 :(得分:6)

禁用UItableviewcell的突出显示

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

cell.userInteractionEnabled = NO;

答案 26 :(得分:5)

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

答案 27 :(得分:5)

Swift Solution w / Custom Cell:

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

答案 28 :(得分:5)

cell.selectionStyle = UITableViewCellSelectionStyleNone;

答案 29 :(得分:5)

您可以使用UITableViewCell的 selectionStyle 属性

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

另外,请勿在代理

下面实施
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }

如果您已创建Xib / Storyboard文件,则可以更改 setUserInteractionEnabled tableview的属性通过取消选中。 这将使您的tableview成为只读。

答案 30 :(得分:5)

你可以使用....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

答案 31 :(得分:5)

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

答案 32 :(得分:5)

您可以使用此

cell.selectionStyle = UITableViewCellSelectionStyleNone;

答案 33 :(得分:5)

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

快乐的编码!!!

答案 34 :(得分:2)

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

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

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

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

答案 35 :(得分:2)

禁用对UITableView中所有UITableViewCell的选择

<Nav.Link to="/" as={Link}>Home</Nav.Link>

为特定的UITableViewCell禁用选择

tableView.allowsSelection = false

答案 36 :(得分:2)

更好的方法是:

cell.userInteractionEnabled = NO;

此方法不会调用didSelectRowAtIndexPath:方法。

答案 37 :(得分:1)

非常简单的东西。返回表视图单元格之前,请使用表视图单元格的style属性。

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

答案 38 :(得分:1)

快速3、4和5

更好的实践,用UITableViewCell

编写代码

例如,您有UITableViewCell,名称为MyCell, 在awakeFromNib中输入self.selectionStyle = .none

完整示例:

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

答案 39 :(得分:1)

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


}

答案 40 :(得分:0)

场景-1

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

Objective-C

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Swift 4.2

cell.selectionStyle = .none

场景-2

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

Objective-C

self.tableView.allowsSelection = false;

Swift 4.2

self.tableView.allowsSelection = false

答案 41 :(得分:0)

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

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

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

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