UITableView 将某些单元格设置为“不可选择”

Posted

技术标签:

【中文标题】UITableView 将某些单元格设置为“不可选择”【英文标题】:UITableView Setting some cells as "unselectable" 【发布时间】:2009-05-01 17:45:40 【问题描述】:

如何将 UITableView 的单元格属性设置为不可选择?当用户点击单元格时,我不想看到那个蓝色的选择框。

【问题讨论】:

请注意最近的 googlers:从 ios 6 及更高版本开始,执行此操作的方法是 tableView:shouldHighlightRowAtIndexPath: as noted by Ayush below 【参考方案1】:

防止行选择

要完全防止选择UITableViewCell,请让您的UITableViewDelegate 实现tableView:willSelectRowAtIndexPath:。如果您不想选择该行,则可以通过该方法返回 nil

- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path

    // Determine if row is selectable based on the NSIndexPath.

    if (rowIsSelectable) 
        return path;
    
    return nil;

这可以防止选择行和调用tableView:didSelectRowAtIndexPath:。但是请注意,这不会阻止该行被突出显示。

防止行高亮

如果您想防止在触摸时突出显示该行,您可以确保将单元格的selectionStyle 设置为UITableViewCellSelectionStyleNone,或者最好让您的UITableViewDelegate 实现tableView:shouldHighlightRowAtIndexPath:,如下所示:

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

    // Determine if row is selectable based on the NSIndexPath.

    return rowIsSelectable;

【讨论】:

谢谢!正是我需要的。 我认为这应该是公认的答案。它实际上解决了问题,而不是掩盖它。 注意tableView:willSelectRowAtIndexPath:在高亮单元格后调用,会产生闪烁。来自Apple的描述: 直到用户触摸一行然后抬起手指时才会调用此方法;直到那时该行才被选中,尽管它在触地时突出显示。 我同意@simpleBob。为了使用此解决方案,您还需要在不可选择的行上将 cell.selectionStyle 设置为 UITableViewCellSelectionStyleNone。否则看起来很俗气。 那么最好的答案仍然是公认的答案。您可以在 didSelectRowAtIndexPath 中选择不执行任何操作,因为无论如何都会调用 willSelectRowAtIndexPath【参考方案2】:

将表格单元格的selectionStyle 属性设置为UITableViewCellSelectionStyleNone。这应该会阻止它突出显示,您还可以在 tableView:didSelectRowAtIndexPath: 中检查该属性。

【讨论】:

肯德尔是对的。按照 Sebastian Celis 的回答,首先防止 didSelectRowAtIndexPath 被调用。不过,您还应该设置 selectionStyle 以防止突出显示。 是的,我想 Sebastian Celis 的答案是正确的答案,谢谢 Daniel Storyboard 爱好者使用静态 TableViews 可以选择一个 UITableViewCell 并在 Attributes Inspector 下找到 Selection 字段并将其设置为 None【参考方案3】:

使用这个:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

【讨论】:

这只会停止显示选择颜色,didSelectRowAtIndexPath 仍会被调用。 这也与 Daniel Dickison 对这个问题的回答完全相同。 Swift 2.2 更新 -- cell.selectionStyle = UITableViewCellSelectionStyle.None【参考方案4】:

仅适用于 iOS 6+。

您可以实现该方法 tableView:shouldHighlightRowAtIndexPath: 在您的代表中。 在这里阅读更多:http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html

【讨论】:

应该有更多的赞成票。这是正确的答案,更改选择样式以使您看不到已选择单元格,禁用用户交互以使您无法点击单元格或取消选择单元格是黑客行为。【参考方案5】:

也有这个问题,尝试了已经提到的所有方法。在选择表格单元格时摆脱“蓝色闪烁”的最后一个技巧是添加以下行:

self.myTableView.allowsSelection = NO;

不确定是这一行还是所有内容的组合,但作为总的结果,我没有更多的蓝色选择,甚至没有蓝色闪光。快乐!

【讨论】:

问题在于它使得表格视图中的所有单元格都不可选择。如果您希望某些单元格可以选择,而其他单元格不可以选择,则不会这样做。塞巴斯蒂安的方法对我有用。 True,allowsSelection = NO 将禁用所有单元格的选择。 Interface Builder 中是否有此属性的等效属性?【参考方案6】:

设置cell.userInteractionEnabled = NO;

【讨论】:

等等,就这样吧。有点。将“FALSE”设为小写并丢失那个疯狂的分号。这将为您快速完成。 “FALSE”是邪恶和错误的,现在“NO”是邪恶和错误的。直到下周,当“假”是邪恶的和错误的时候,这样做。【参考方案7】:

使用 IB 也是一种优雅的方式:

【讨论】:

【参考方案8】:

Apple 说你应该在 didSelectRowAtIndexPath 中做的第一件事是取消选择行

[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];

然后您可以将 AccessoryType 更改为复选标记或无等。因此,当您输入 didSelectRowAtIndexPath 时,您可以取消选择该行,如果它不应该被选中,则根本不检查该行。

Table View Programming Guide

【讨论】:

在这种情况下,当用户触摸单元格时,它会在短时间内突出显示,然后不突出显示 - 但据我了解,关键是完全停止突出显示。【参考方案9】:

另一种方法是向UITableViewCell 添加几个类别方法。我比塞巴斯蒂安(也很好)的回答更喜欢这个,因为我建立桌子的方式。我认为这可能对其他人有帮助。

- (void)setSelectable:(BOOL)enabled 
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
    [self setUserInteractionEnabled:enabled];


- (BOOL)isSelectable 
    BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
                     [self isUserInteractionEnabled];
    return ! disabled;

【讨论】:

【参考方案10】:

斯威夫特 4: 您可以使用 UITableViewDelegate 防止选择和突出显示:shouldHighlightRowAt 此答案假定您创建了一个名为:CustomTableViewCell 的自定义单元格 并且您在该自定义单元格中创建了一个布尔值,名为:isSelectable

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool 
    let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
    if cell.isSelectable == false 
        return false
     else 
        return true
    

这是 Sebastian Celis 的 objc 答案的 Swift 版本。

【讨论】:

【参考方案11】:

如果您在 Interface Builder 中设计了单元格,则可以通过从 tableViewCell 的“User Interaction Enabled”中删除复选框来完成此操作。

【讨论】:

【参考方案12】:

斯威夫特 5

cell.isUserInteractionEnabled = false

【讨论】:

【参考方案13】:

还有另一种简单的方法可以避免选择显示为蓝色。

选择一个您不想显示为蓝色的单元格。

然后选择属性检查器(侧面属性视图中标尺图标旁边的盾牌图标)。

然后将“选择”字段从“蓝色”更改为“无”。

注意,大概这仍在选择中,如果您只想避免 UI 效果,它就不会显示为选中状态。

【讨论】:

【参考方案14】:

使用 tableView: willDisplayCell: forRowAtIndexPath: 代替 tableView: didSelectRowAtIndexPath: 以消除第一次触摸单元格时出现的闪光。

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

【讨论】:

【参考方案15】:

要取消选中某些行,您必须对 UITableView 委托的两种方法进行一些更改。

在下面的方法中

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

分配完单元格后,写下面的代码

if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;

如果用户以某种方式尝试选择,上述代码将阻止突出显示单元格。

在下面的这个委托方法中

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if(indexPath.row == someCellNumber) return;

    //for other cells write the code below...

如果你不写if(indexPath.row == someCellNumber) return; 行仍然会被选中,并且有可能导致应用崩溃

【讨论】:

【参考方案16】:

斯威夫特 4:

在单元格类中:

selectionStyle = .none

【讨论】:

以上是关于UITableView 将某些单元格设置为“不可选择”的主要内容,如果未能解决你的问题,请参考以下文章

仅某些单元格中的addSubView

UITableView的allowMultipleSelectionDuringEditing - 不显示某些单元格的编辑圈

仅在某些单元格中添加SubView

使用 UITableViewAutomaticDimension 时如何手动设置某些单元格的设置高度?

更改单元格中的数据后,UITableView 中的自定义单元格将无法正确重新加载

如何将 UIImage 设置为 UITableView Cell,它根据我在 UILabel 中输入的文本动态计算单元格高度?