如何禁用UITableView选择?

…衆ロ難τιáo~ 提交于 2019-12-11 12:03:49

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


#1楼

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

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


#2楼

试试这个

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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


#3楼

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

tableView.allowsSelection = false

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

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

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

tableView.allowsSelectionDuringEditing = false 

#4楼

iOS 6.0开始, UITableViewDelegatetableView:shouldHighlightRowAtIndexPath: . (在iOS 文档中阅读它。)

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


#5楼

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

didSelectRowAtIndexPath

下列

[tableView deselectRowAtIndexPath:indexPath animated:YES];

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


#6楼

我一直在与这个相当激烈的斗争,在我的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一起使用,因此单元格不会在触摸事件上闪烁


#7楼

禁用UItableviewcell的突出显示

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

cell.userInteractionEnabled = NO;

#8楼

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


#9楼

你可以用它

cell.selectionStyle = UITableViewCellSelectionStyleNone;

#10楼

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

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

#11楼

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

Objective-C的:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

要么

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

斯威夫特2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3和4.x:

cell.selectionStyle = .none

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

更多信息在这里这里


#12楼

您可以使用 ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

#13楼

您还可以将背景颜色设置为Clear以实现与UITableViewCellSelectionStyleNone相同的效果,以防您不希望/不能使用UITableViewCellSelectionStyleNone

您将使用如下代码:

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

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


#14楼

cell.selectionStyle = UITableViewCellSelectionStyleNone;

#15楼

您可以使用 :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

你也可以使用:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

在tableview didselectrowatindexpath方法。


#16楼

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

快乐的编码!


#17楼

Objective-C的:

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

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

     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 

#18楼

如果有人需要Swift的答案:

cell.selectionStyle = .None

#19楼

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


#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


}

#21楼

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;

#22楼

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

cell?.selectionStyle = UITableViewCellSelectionStyle.None

#23楼

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

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

cell.selectionStyle = UITableViewCellSelectionStyle.None

#24楼

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


#25楼

SWIFT的固定解决方案3

cell.selectionStyle = .none

#26楼

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


#27楼

尝试输入:

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

#28楼

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

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

cell.userInteractionEnabled = NO;

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

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

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

tableView.allowsSelection = NO;

(感谢Paulo De Barros,谢谢!)


#29楼

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



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

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

#30楼

我们可以写代码

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

自定义单元格xib

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!