ios - 重新排序 UITableView:用户第一次开始使用手柄拖动时的通知
问题描述
我有一个带有单元格的 UITableView,我希望用户能够通过使用每个单元格右侧的“句柄”向上和向下拖动它们来重新排序。我不想实现“拖放”功能,因为这些单元格后面的数据在此表之外没有任何意义(鉴于表视图及其单元格后面的数据,实现 NSItemProvider 看起来是一个丑陋的过程)。到目前为止,一切都已实施并且工作正常。看起来有点像这篇文章的结果。
下一步是,我想知道用户何时“抬起”或开始移动单元格——类似于使用拖放时的dragStateDidChange能力。我想在单元格被移出原位之前收到此通知——因为 UI 将单元格背景变为白色并将其“提升”到表格上方。
如何在不实施“拖放”的情况下获得此通知?
我尝试过的事情并没有达到我想要的效果:
- 识别长按手势:我确实在这些单元格上使用手势识别器进行点击等;似乎当用户触摸拖动手柄以重新排列单元格时,此操作不会触发长按手势。试过了,没有成功。
- will-select-row-at:我
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath?
在 UITableViewDelegate 代码中实现该功能;当用户触摸拖动手柄时不会调用它。 - targetIndexPathForMoveFromRowAt:
func tableView(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath
当拖动的单元格改变位置时触发该函数,但直到那时才触发;它没有捕捉到我正在寻找的提升/拖动过程的开始。 - 同样,也不会调用 willBeginEditingRowAt 和 shouldHighlightRowAt。
- 各种 scrollView 函数:它们都在用户滚动整个表格时调用,而不是在用户重新排序时调用。
- 注意“设置编辑”:拖动手柄需要始终存在,因此“编辑”始终设置为 true。
- 有点类似的问题,不幸的是没有我可以使用的答案(也不是在 Swift 中)。
我怀疑必须有一个简单的通知,表明单元格已被抬起并正在使用手柄拖动,即使它尚未移动到足以高于或低于其旧位置的距离。毕竟,操作系统“知道”这一点,因为它改变了背景并添加了阴影等等。任何访问该通知以便其他代码也可以响应它的帮助将不胜感激!
解决方案
有点奇怪,这些没有记录,但是您可以在您的UITableViewController
(或在UITableViewDelegate
)中定义以下函数,这些函数将分别在单元格拖动开始或结束时调用:
@objc func tableView(_ tableView: UITableView, willBeginReorderingRowAtIndexPath indexPath: IndexPath) {
// Dragging started
}
@objc func tableView(_ tableView: UITableView, didEndReorderingRowAtIndexPath indexPath: IndexPath) {
// Dragging ended
}
推荐阅读
- javascript - 如何为作为道具传递给组件的函数编写测试用例
- c# - 如何在 Windows 窗体中使用 MediaPlayer c#
- java - 无法理解 Java 数组导致 IntelliJ(Java 中的新手)
- nestjs - 我的守卫自动嵌入到控制器 Nestjs 中的另一种方法
- angular - 如何创建充当窗口的工具提示?
- reactjs - 阻止日历滚动到下个月
- awk - 使用模式匹配以及前 6 列从第 7 列打印特定值
- csv - 一次 awk 多个转换/分隔符
- android - Kotlin Coroutines 如何实现以正确的方式调用 api
- javascript - 是否有任何库可用于在节点 js/Javascript 中执行对三重存储的 sparql 查询?