滚动时不小心点击了 UITableViewCell

UITableViewCell accidentally tapped while scrolling

我有一个 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 委托方法检查是否应突出显示单元格。