如何禁用UITableView选择?

Dav*_*idM 1176 cocoa-touch uitableview ios

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

Mar*_*don 1949

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

Objective-C的:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)

要么

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Run Code Online (Sandbox Code Playgroud)

斯威夫特2:

cell.selectionStyle = UITableViewCellSelectionStyle.None
Run Code Online (Sandbox Code Playgroud)

Swift 3和4.x:

cell.selectionStyle = .none
Run Code Online (Sandbox Code Playgroud)

此外,请确保您未-tableView:didSelectRowAtIndexPath:在表视图委托中实现,或者如果您实现它,则明确排除您不想要操作的单元格.

更多信息在这里这里

  • @Tony如果你在单元格中有一个UITextField,这是个坏主意. (122认同)
  • @TonyMillion如果你想使用内置的编辑控件,例如刷卡到删除,这也是一个坏主意.如果将userInteractionEnabled设置为NO,则删除按钮不会响应用户触摸事件. (72认同)
  • 迟到此线程,但使用cell.allowsSelection而不是userInteraction.这会阻止单元格的交互方法,但不会阻止常规的UIView响应程序. (47认同)
  • 我将对答案进行投票,但为了清楚起见,OP仅要求禁用"突出显示",否则禁用整个单元格交互,因此所有这些评论都是非正式的. (25认同)
  • 设置cell.userInteractionEnable = No不会停止触发didSelectRowAtIndexPath. (4认同)
  • @Tony这确实很有效,谢谢!如何将其作为答案发布,以便我们可以将其推荐到顶部? (3认同)
  • 只是为了添加一件事.在swift中,建议的变为:cell.selectionStyle = UITableViewCellSelectionStyle.None (2认同)
  • @TonyMillion如果你想在单元格中启用UILabel文本的复制,这也是一个坏主意. (2认同)

小智 581

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

didSelectRowAt#

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

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

  • 这是如何被接受的答案,并有这么多的票?它完全没有回答这个问题!您需要在单元格上设置`selectionStyle`属性:Swift中的`cell.selectionStyle = UITableViewCellSelectionStyle.None`,或Objective-C中的`cell.selectionStyle = UITableViewCellSelectionStyleNone`. (497认同)
  • 根据需要,有几种方法可以做到这一点.没有选择风格,没有选择既可以工作,也可以都失败.这是一个例子.如果要选择单元格并调用`tableViewDidSelectRowAtIndexPath`,则需要`cell.selectionStyle = .None`.如果您不想要或不关心要调用该委托函数(即在tableViewCell中有一个textfield),那么设置`tableView.allowsSelection = false`就可以了. (15认同)
  • 这终于为我工作了,我试着用cell.selectionStyle = UITableViewCellSelectionStyleNone; 但它不起作用.有一点需要注意:它应该是:tableView.allowsSelection = NO; 不是假的. (6认同)
  • 我想,这是最好的选择.单元格上的按钮处于活动状态,但文本不活动. (6认同)
  • 这对我来说很有用.`tableView.allowSelection = false` (5认同)
  • 是的,这个答案对于给定的问题是正确的.OP想要禁用对单元格的选择. (3认同)
  • 在搜索"如何禁用uitableview didSelectRowAtIndexPath背景颜色"时导航用户是谷歌的错.所以归咎于谷歌 (3认同)
  • 对我来说工作得很好,我仍然可以在我的单元格中与文本字段,选择器等进行交互 (2认同)
  • 100%错误答案.这不会禁用突出显示,这将完全禁用选择 (2认同)
  • 对我来说不好的解决方案 - 禁用选择.Com'on伙计们. (2认同)
  • @nodebase怎么会有人说这个*确实*有效?我糊涂了 (2认同)
  • 这最终在viewWillAppear方法中为我工作`tableView.allowsSelection = false`. (2认同)

mbm*_*414 352

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



因此,根据您所需的逻辑和/或结果,实际上有5种不同的答案:

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Run Code Online (Sandbox Code Playgroud)

当我在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
    }
}
Run Code Online (Sandbox Code Playgroud)



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

[tableView setAllowsSelection:NO];
Run Code Online (Sandbox Code Playgroud)

在我的测试中,这仍然允许内部的控件UITableViewCell是交互式的.


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

[cell setUserInteractionEnabled:NO];
Run Code Online (Sandbox Code Playgroud)



4.使整个表格"只读"

[tableView setUserInteractionEnabled:NO];
Run Code Online (Sandbox Code Playgroud)



5.要在运行中确定是否突出显示一个单元格(根据此答案隐含包含选择),您可以实现以下UITableViewDelegate协议方法:

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)

  • #4是一个可怕的想法,这样做也会禁用表视图中的滚动 (8认同)
  • 是.如果要禁用选择但允许UIButtons等...继续支持用户交互,请使用#2.如果您想要一个完全只读的单元格,请使用#4.当然,为什么你会在非交互式单元格中拥有除UIViews或UILabels之外的任何内容.也许有人会想要在发生其他事情时禁用所有交互. (4认同)
  • @simon实际上,这不是一个可怕的想法; 根据您的具体情况,这是一个可能或可能不是一个好选择的选项.此外,#4禁用用户滚动; 如果有必要,你仍然可以实现自己的.我同意#4没用多少,但这不是一个糟糕的主意. (4认同)
  • 如果从笔尖加载单元格设计,则复选框(在IB中)将适用于#3(和#4的表格).对于#4 vs#2,单元格内的控件是否具有交互性是有区别的吗? (3认同)
  • 为了完整性,你可以为[`tableView:shouldHighlightRowAtIndexPath:`](http://stackoverflow.com/a/13167946/2547229)添加一个喊叫声,这是_generally_(并不总是)我的首选方法. (3认同)

Jos*_*phH 82

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

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

cell.userInteractionEnabled = NO;
Run Code Online (Sandbox Code Playgroud)

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

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Run Code Online (Sandbox Code Playgroud)

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

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

tableView.allowsSelection = NO;
Run Code Online (Sandbox Code Playgroud)

(感谢Paulo De Barros,谢谢!)


cbo*_*wns 56

截至iOS 6.0,UITableViewDelegate已有tableView:shouldHighlightRowAtIndexPath:.(在iOS 文档中阅读它.)

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

  • 偶然发现了这个线程,在此之前,我看到如此多的其他答案感到震惊。毫无疑问,这是正确的方法。 (2认同)
  • 这确实是应该考虑的正确且唯一的答案。提到userInteraction的其他所有内容都是完全错误的。 (2认同)

vig*_*mar 49

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

UITableView Inspector

  • 最佳解决方案IMHO (2认同)

MAN*_*HAK 45

SWIFT的固定解决方案3

cell.selectionStyle = .none
Run Code Online (Sandbox Code Playgroud)


小智 34

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

didSelectRowAtIndexPath
Run Code Online (Sandbox Code Playgroud)

下列

[tableView deselectRowAtIndexPath:indexPath animated:YES];
Run Code Online (Sandbox Code Playgroud)

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

  • 通过这种方法,行立即突出显示,然后在半秒内消失.这就是Apple设置菜单的方式,所以它对我来说很好看. (3认同)

Aks*_*Aks 34

如果有人需要Swift的答案:

cell.selectionStyle = .None
Run Code Online (Sandbox Code Playgroud)


Zai*_*han 34

在你UITableViewCell厦门国际银行在属性检查器中设置的值SelectionNone.

在此输入图像描述


Ahs*_*him 29

这是我用的,cellForRowAtIndexPath写这段代码:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)


use*_*806 28

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

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

  • 我不喜欢这种方法,因为它仍会显示处于突出显示状态的单元格,直到触摸为止. (4认同)
  • 这正是我喜欢它的原因:-) (2认同)

小智 22

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


Objective-C的:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)

要么

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Run Code Online (Sandbox Code Playgroud)


斯威夫特2:

cell.selectionStyle = UITableViewCellSelectionStyle.None
Run Code Online (Sandbox Code Playgroud)


斯威夫特3:

cell.selectionStyle = .none
Run Code Online (Sandbox Code Playgroud)


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


}
Run Code Online (Sandbox Code Playgroud)


Aru*_*pta 20

Objective-C的:

  1. 下面的代码段禁用突出显示,但它也禁用了调用didSelectRowAtIndexPath.所以,如果你没有实现,didSelectRowAtIndexPath那么使用下面的方法.在创建表时应该添加此项.这将适用于按钮和UITextField单元格内部.

    self.tableView.allowsSelection = NO;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 下面的代码段禁用突出显示,但不会禁用该调用didSelectRowAtIndexPath.将单元格的选择样式设置为无cellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在片段下面禁用单元格上的所有内容.这将禁用互动buttons,textfields:

    self.tableView.userInteractionEnabled = false;
    
    Run Code Online (Sandbox Code Playgroud)

迅速:

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

  1. 更换第一个解决方案

    self.tableView.allowsSelection = false
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更换第二种解决方案

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
    
    Run Code Online (Sandbox Code Playgroud)
  3. 更换第三种解决方案

    self.tableView.userInteractionEnabled = false
    
    Run Code Online (Sandbox Code Playgroud)


wzb*_*zon 19

尝试输入:

cell.selected = NO;
Run Code Online (Sandbox Code Playgroud)

它会在需要时取消选择您的行.

在Swift3中......

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


Yar*_*k T 14

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

设置UITableView

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

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

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

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


iDh*_*val 11

我们可以写代码

 cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)

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

自定义单元格xib

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


小智 11

您只需将此代码放入cellForRowAtIndexPath即可

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

cell.selectionStyle = UITableViewCellSelectionStyle.None
Run Code Online (Sandbox Code Playgroud)


小智 10

试试这个

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Run Code Online (Sandbox Code Playgroud)

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


pri*_*tam 10

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

cell?.selectionStyle = UITableViewCellSelectionStyle.None
Run Code Online (Sandbox Code Playgroud)


Abd*_*han 8

UITableViewDataSource协议,里面的方法cellForRowAt添加:

let cell = tableView.dequeueReusableCell(withIdentifier: "YOUR_CELL_IDENTIFIER", for: indexPath)                
cell.selectionStyle = .none
return cell
Run Code Online (Sandbox Code Playgroud)

或者

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


Ras*_*tif 8

斯威夫特 3,4 和 5

更好的实践,写代码UITableViewCell

例如,你有UITableViewCellname MyCell,In awakeFromNibjust writeself.selectionStyle = .none

完整示例:

class MyCell: UITableViewCell {
    
    override func awakeFromNib() {
        super.awakeFromNib()
        self.selectionStyle = .none
    }
    
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*den 7

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)

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

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


Kam*_*min 7

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

在此输入图像描述


tes*_*ing 7

禁用 UITableView 中所有 UITableViewCell 的选择

tableView.allowsSelection = false
Run Code Online (Sandbox Code Playgroud)

禁用特定 UITableViewCell 的选择

cell.selectionStyle = UITableViewCell.SelectionStyle.none
Run Code Online (Sandbox Code Playgroud)


Sha*_*rme 6

禁用UItableviewcell的突出显示

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)

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

cell.userInteractionEnabled = NO;
Run Code Online (Sandbox Code Playgroud)


vir*_*ndh 6

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

您将使用如下代码:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Run Code Online (Sandbox Code Playgroud)

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


Ann*_*nnu 6

您可以使用 :

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)

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

你也可以使用:

[tableView deselectRowAtIndexPath:indexPath animated:NO];
Run Code Online (Sandbox Code Playgroud)

在tableview didselectrowatindexpath方法.


And*_*ano 6

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

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

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

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


iEi*_*ein 5

你可以用它

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)


Har*_*ini 5

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Run Code Online (Sandbox Code Playgroud)

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


Mak*_*083 5

您可以使用 ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Run Code Online (Sandbox Code Playgroud)


小智 5

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)


小智 5

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Run Code Online (Sandbox Code Playgroud)

快乐的编码!


小智 5

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


Zor*_*ayr 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
  } 
}
Run Code Online (Sandbox Code Playgroud)


Jay*_*bey 5

您可以使用UITableViewCell的selectionStyle属性

 cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)

要么

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Run Code Online (Sandbox Code Playgroud)

另外,不要在代理下面实现

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }
Run Code Online (Sandbox Code Playgroud)

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