【问题标题】:UITableViewCell accidentally tapped while scrollingUITableViewCell 滚动时意外点击
【发布时间】:2021-01-24 17:43:26
【问题描述】:

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

我正在使用

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

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

但现在我遇到了一个问题,有时只是滚动表格视图会意外触发点击操作

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

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

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

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


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

【问题讨论】:

    标签: ios swift uitableview


    【解决方案1】:

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

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

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

    【讨论】:

    • 想不出别的了。希望它能解决你的问题
    • 刚刚收到反馈!不幸的是,虽然这个解决方案应该对以前被窃听过的单元格有所帮助,但它不能解决这个问题,因为他们说它甚至在应用程序启动后就会发生。我确实能够重现它:如果手指在开始滚动手势之前停留在单元格上一小段时间,就会发生这种情况。这是有道理的:触摸该行并突出显示。我没有注意到,因为我快速向上滑动滚动,我的手指从不停留在屏幕上。感谢您的帮助,对不起:我可能没有很好地解释。我会在问题中添加这个。
    • 你可能是对的shouldHighlightRowAt,Apple 说“当触摸事件到达时,表格视图会突出显示预期用户选择它们的行。当它处理这些触摸事件时,表格视图调用此方法询问您的代表是否应突出显示给定的单元格。”所以我想这是我应该测试表格是否滚动的地方(在这种情况下我应该使突出显示无效),如果不是我可以验证点击?不知道该怎么做,但我会尝试一下。
    • 你确实是对的。如果tableView.isTracking 似乎可以解决问题,则在shouldHighlightRowAt 中返回false。非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多