ios - uitableviewcontroller使用 - 我如何禁用UITableView选择突出显示?




objective-c cocoa-touch (20)

当您在UITableView点击一行时,该行将突出显示并被选中。 是否有可能禁用此功能,因此点击一行无能为力?


Objective-C的:

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

    self.tableView.allowsSelection = NO;
    
  2. 在snippet下方禁用高亮显示,并且不会禁用对didSelectRowAtIndexPath的调用。 cellForRowAtIndexPath中将单元格的选择样式设置为None

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. 在snippet下方禁用单元格上的所有内容。 这将禁用与buttonstextfields的交互:

    self.tableView.userInteractionEnabled = false;
    

迅速:

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

  1. 替换第一个解决方案

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

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

    self.tableView.userInteractionEnabled = false
    

SWIFT的固定解决方案3

cell.selectionStyle = .none

UITableViewDelegate协议可以使用方法willSelectRowAtIndexPathreturn nil如果你不想选择该行。

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


从iOS 6.0开始, UITableViewDelegate具有tableView:shouldHighlightRowAtIndexPath: (请阅读iOS Documentation 。)

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


你可以使用这个

cell.selectionStyle = UITableViewCellSelectionStyleNone;

因为我最近阅读过这篇文章,它帮了我很大的忙,所以我想发表另一个答案来巩固所有的答案(后人)。


所以,根据您所需的逻辑和/或结果,实际上有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 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

如果你不想/不能使用UITableViewCellSelectionStyleNone ,你也可以将背景颜色设置为Clear来获得与UITableViewCellSelectionStyleNone相同的效果。

你会使用如下代码:

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

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


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

didSelectRowAtIndexPath

下列

[tableView deselectRowAtIndexPath:indexPath animated:YES];

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


对我而言,以下工作正常:

tableView.allowsSelection = NO;

这意味着didSelectRowAt#根本行不通。 也就是说,触摸表格中的一行,就不会做任何事情。 (因此,显然,永远不会有选择动画。)

(请注意,如果在单元格中有UIButton或任何其他控件,那么当然这些控件仍然可以工作。在表格单元格中碰巧有的任何控件与UITableView允许您“选择一行“使用didSelectRowAt# 。)


尝试输入:

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

快速取消选择

cell.selectionStyle = .None

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


您可以使用 ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

Objective-C的:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

要么

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3:

cell.selectionStyle = .none

此外,请确保您在表视图委托中不实施-tableView:didSelectRowAtIndexPath:或者如果您实施了它,请明确排除您希望没有操作的单元。

更多信息在这里here


我一直在与这个非常大量的斗争,在我的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;
}

这与将选择样式设置为无关联,因此单元格不会在触及事件时闪烁


我们可以编写类似的代码

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

但是当我们在上面定制单元xib时 给出警告

定制单元xib

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


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

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

cell.userInteractionEnabled = NO;

除了阻止选择,这也会停止tableView:didSelectRowAtIndexPath:被设置的单元格调用。 (感谢Tony Million为此回答,谢谢!)

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

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

如果您想禁用整个表格的选择,请使用:

tableView.allowsSelection = NO;

(感谢Paulo De Barros,谢谢!)


禁用UItableViewcell的高亮显示

cell.selectionStyle = UITableViewCellSelectionStyleNone;

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

cell.userInteractionEnabled = NO;

这是我使用的:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

在cellForRowAtIndexPath中写入这段代码。


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

快乐编码!





highlight