UITableViewCell 滚动时意外点击

问题描述

我有一个 UITableView。每一行都是可点击的并触发一个操作(点击更新单元格内容,在主线程上,然后在后台线程中的 CoreData 中添加一些内容)。

我正在使用

func tableView(_ tableView: UITableView,didHighlightRowAt indexPath: IndexPath)

UITableViewDelegate 中检测点击,因为根据我的经验,使用此方法点击行比使用 didSelectRowAt 更具反应性,并且我希望用户能够按顺序快速点击几次在同一行,就像一个理货。

但现在我遇到一个问题,即有时只是滚动 tableview 可能会意外触发点击操作

就好像在开始滚动手势时手指第一次触摸屏幕一样,单元格注册的是点击而不是“开始滚动”。 UITableViewCell 现在有点过于敏感了。

我想也许我可以停止使用 didHighlightRowAt,而是在每个 UITableViewCell 上添加一个手势识别器,并且仅在识别器没有看到滚动时才触发操作,但感觉不对。

达到某种中间立场的方法是什么?

我的意思是,让单元格保持反应,但避免在用户刚开始滚动时触发点击。也许我在这种情况下使用 didHighlightRowAt 犯了一个错误


编辑:它甚至在应用启动后立即发生。我只是第一次能够重现它:如果手指在开始滚动手势之前停留在单元格上很短时间,就会发生这种情况。我猜这是有道理的:触摸该行并突出显示它,即使手指没有从屏幕上抬起。我没有注意到,因为我总是快速向上滑动来滚动,我的手指从不停留在屏幕上。

解决方法

我猜你的问题是当滚动单元格被重用并且它们的状态保持突出显示时,didHighlightRowAt 委托方法被调用。一种可能的解决方案是在自定义单元格子类中重置 prepareForReuse 中突出显示的值:

override func prepareForReuse() {
    super.prepareForReuse()
    isHighlighted = false
}

或者您也可以使用 shouldHighlightRowAt 委托方法检查是否应突出显示单元格。