如何禁用UITableView选择?

问题描述 投票:1150回答:36

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

ios uitableview cocoa-touch
36个回答
565
投票

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

tableView.allowsSelection = false

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

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

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

tableView.allowsSelectionDuringEditing = false 

33
投票

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

enter image description here


29
投票

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

28
投票

如果你不想选择行,你可以使用UITableViewDelegatewillSelectRowAtIndexPath这个方法来自return nil协议。

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


20
投票

Objective-C的:

  1. 下面的代码段禁用突出显示,但它也禁用了对didSelectRowAtIndexPath的调用。因此,如果您没有实施didSelectRowAtIndexPath,请使用以下方法。在创建表时应该添加此项。这将适用于单元格内的按钮和UITextFieldself.tableView.allowsSelection = NO;
  2. 在片段下方禁用突出显示,它不会禁用对didSelectRowAtIndexPath的调用。在cellForRowAtIndexPath中将单元格的选择样式设置为None 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

20
投票

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

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


}

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图像:

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

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

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

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


11
投票

我们可以写代码

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

自定义单元格xib

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


11
投票

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

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

cell.selectionStyle = UITableViewCellSelectionStyle.None

10
投票

试试这个

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

您还可以使用界面构建器设置选择样式。


1928
投票

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

Objective-C的:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

要么

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

斯威夫特2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3和4.x:

cell.selectionStyle = .none

此外,请确保您未在​​表视图委托中实现-tableView:didSelectRowAtIndexPath:,或明确排除您希望在没有操作的情况下执行它的单元格。

More info herehere


10
投票

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

cell?.selectionStyle = UITableViewCellSelectionStyle.None

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
投票

你也可以将背景颜色设置为Clear以达到与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方法。


6
投票

直接在故事板中禁用UITableViewCell的突出显示

enter image description here


5
投票

你可以用它

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5
投票

您可以使用 ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

5
投票
cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

快乐的编码!


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

5
投票

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


82
投票

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

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

cell.userInteractionEnabled = NO;

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

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

tableView.allowsSelection = NO;

(感谢Paulo De Barros,谢谢!)


55
投票

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

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


49
投票

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


46
投票

SWIFT的固定解决方案3

cell.selectionStyle = .none

34
投票

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

didSelectRowAtIndexPath

下列

[tableView deselectRowAtIndexPath:indexPath animated:YES];

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


34
投票

如果有人需要Swift的答案:

cell.selectionStyle = .None
© www.soinside.com 2019 - 2024. All rights reserved.