在编辑模式下禁用表格视图单元格突出显示的颜色?

Posted

技术标签:

【中文标题】在编辑模式下禁用表格视图单元格突出显示的颜色?【英文标题】:Disable tableview cell highlighted color in edit mode? 【发布时间】:2018-03-27 17:03:19 【问题描述】:

如何在编辑模式下删除表格视图单元格突出显示的颜色。我在编辑模式下使用表格视图属性“allowsMultipleSelection”。默认情况下,单元格以浅蓝色突出显示。尽管我们可以更改突出显示的颜色,但我没有看到任何删除突出显示颜色属性的选项。我只希望我的表格视图单元格复选框选择而不是突出显示模式。

“cell.SelectedBackgroundView”允许在选中单元格时更改单元格的背景颜色,但我只想选择复选框,而处于选中状态的单元格没有颜色。

附加的屏幕图像。在我的情况下,单元格有一个背景图像,所以在选择时我也希望单元格背景相同,并且只选择复选框。

【问题讨论】:

cellForRowAtIndexPath 中尝试cell?.selectionStyle = .none,或者您也可以禁用从情节提要中选择单元格。 @AnkitJayaswal 我不想禁用单元格选择,而是想禁用在选择时“突出显示”的单元格。 cell?.selectionStyle = .none 禁用选择本身。 selectionStyle 仅表示样式,您几乎没有选项可以在选择时突出显示您的单元格。如果将其设置为.none,它只会阻止在选择时显示颜色。但是选择会正常工作,您可以通过在 didSelectRowAtIndexPath 中应用 breakpoint 来看到这一点 @AnkitJayaswal 我正在使用 UITableview (AllowsMultipleSelectionDuringEditing) 提供的默认编辑属性,在这种情况下,单元格选择仅由 tableview 处理。因此,如果我们给出“.none”,则选择本身不会发生。 可以共享现有的委托数据源方法吗? 【参考方案1】:

UITableViewCell 具有selectionStyle 属性以突出显示所选单元格。这些样式用如下颜色突出显示单元格:

蓝色、灰色、默认(浅灰色)、无

在选择.none 样式时,它只会阻止突出显示单元格。它不会阻止选择。您可以通过在didSelectRowAt indexPath: 函数中应用断点来查看:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    print("UITableView Selected")

【讨论】:

【参考方案2】:

在您的单元格类中重写此方法:

override func setHighlighted(_ highlighted: Bool, animated: Bool) 

override func setSelected(_ selected: Bool, animated: Bool) 
    super.setSelected(selected, animated: false)
    let viewForHighlight = UIView()
    self.selectedBackgroundView = viewForHighlight
    if self.isEditing 
        viewForHighlight.backgroundColor = UIColor.clear
     else 
        viewForHighlight.backgroundColor = UIColor.gray
    

【讨论】:

这很好用。我正在使用 UITableViewController 并在正常选择单元格时推送另一个视图控制器。当我返回主视图控制器时,我发现该单元格在此更改后突出显示。将 setHighlighted 更改为此似乎可以为我解决问题。 if !isEditing super.setHighlighted(highlighted, animated: animated) 【参考方案3】:

我会看看这个委托方法:tableView(_:shouldHighlightRowAt:) 您可以通过在所需状态下返回 false 来检查您是否正在编辑和完全禁止突出显示。

【讨论】:

会检查的。谢谢。 试过这个方法,但是如果我在这个方法上返回“false”,单元格的选择就会被禁用。【参考方案4】:

如果您尝试完全删除选择,则可以使用以下代码

对于 Swift 3 cell.selectionStyle = UITableViewCellSelectionStyle.none

对于 Swift 4 cell.selectionStyle = .none

【讨论】:

不,我希望选择发生,但不希望单元格突出显示。我只想要复选框刻度线。【参考方案5】:

还有一个选择是使用(在 Objective-C 中,你当然可以在 Swift 中做类似的事情):

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

根据您的模型或数据或其他任何内容,在此方法中您可以选中或取消选中每个单元格中的框,以及关闭突出显示。

来自文档:

表格视图在使用单元格绘制行之前将此消息发送给其委托人,从而允许委托人在单元格对象显示之前对其进行自定义。此方法使委托有机会覆盖先前由表视图设置的基于状态的属性,例如选择和背景颜色。代理返回后,表格视图仅设置 alpha 和 frame 属性,然后仅在行滑入或滑出时设置动画。

【讨论】:

自从我昨天输入答案以来,已经添加了很多新信息。我现在更清楚你在寻找什么,我认为我的答案不是正确的方法。【参考方案6】:

试试这个方法,我刚刚检查过,它可以按你的需要工作:

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool 
        let cell = tableView.cellForRow(at: indexPath)
        let selectedColor: UIColor
        let selectedView = UIView(frame: CGRect.zero)
        if tableView.isEditing == true 

            selectedColor = .clear
         else 
            selectedColor = .lightGray
        
        selectedView.backgroundColor = selectedColor
        cell?.multipleSelectionBackgroundView = selectedView
        return true
    

【讨论】:

@anovoselov 这不起作用,在这种情况下,单元格选择本身也被禁用。 @anovoselov 会检查一下。 @subin272 你做了什么? @Daedelus 在表格视图提供的默认编辑模式下,我们无法更改选择时的突出显示颜色。我们必须使用自定义单元格以编程方式实现编辑模式。 @subin272 如果您使用 UIImageView 作为背景,突出显示不会打扰您。我尝试并“终于”成功了。【参考方案7】:

ios 14 及更高版本中,您现在可以在 UITableViewCell 子类中简单地执行此操作:

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    
    // Prevent cell highlighting while preserving selectability and separator views
    var backgroundConfig = UIBackgroundConfiguration.listPlainCell()
    backgroundConfig.backgroundColor = .clear
    backgroundConfiguration = backgroundConfig

有关同样适用于 iOS 13 及更低版本的解决方案,请参阅https://***.com/a/64582629/171933

【讨论】:

以上是关于在编辑模式下禁用表格视图单元格突出显示的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

单击时突出显示表格视图单元格

如何禁用 UITableViewCell 突出显示?

选择单元格时,更改 QTableView 中图标的颜色突出显示

uitableview 单元格突出显示

如何避免在表格视图中突出显示两个单元格?

用户滑动时表格视图单元格突出显示