重新排序UITableView:用户首次开始使用手柄拖动时发出通知

时间:2018-12-02 18:59:44

标签: ios swift uitableview

我有一个带有单元格的UITableView,我希望用户能够通过使用每个单元格右侧的“手柄”上下拖动它们来重新排序。我不想实现“拖放”功能,因为这些单元格后面的数据在该表之外毫无意义(考虑到表视图及其单元格后面的数据,实现NSItemProvider看起来是一个丑陋的过程)。到目前为止,一切都已实现且运行良好。看起来有点像this article的结果。

下一步是,我想知道用户何时“抬起”或开始移动单元格-类似于一个IS使用拖放操作时的dragStateDidChange功能。我想在单元格移出位置之前就收到此通知-当UI将单元格背景变白并“抬高”到表格上方时。

如何在不执行“拖放”的情况下获得此通知?

我尝试过的事情没有实现我想要的:

  • 识别长按手势:我确实在这些单元格上使用了手势识别器来进行水龙头等操作;似乎当用户触摸拖动手柄以重新排列单元格时,此操作不会触发长按手势。尝试过,没有成功。
  • 将选择行:我在UITableViewDelegate代码中实现了功能func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath?;用户触摸拖动手柄时不会调用它。
  • targetIndexPathForMoveFromRowAt:函数func tableView(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath在所拖动的单元格更改位置时触发,但直到那时才触发;它并没有赶上我要查找的提升/拖动过程的开始。
  • 同样,willBeginEditingRowAt和shouldHighlightRowAt都不会被调用。
  • 各种scrollView函数:它们都在用户滚动整个表时调用,而不是在用户重新排序时调用。
  • 注意“设置编辑”:拖动手柄必须始终存在,因此“编辑”始终设置为true。
  • Somewhat similar question,很遗憾,我没有可以使用的答案(而且在Swift中也没有)。

我怀疑必须有一个简单的通知,即牢房已被抬起并正在使用手柄拖动,即使它还没有移动到足够高的位置仍在其旧位置之上或之下。毕竟,操作系统会“知道”这一点,因为它会更改背景并添加阴影等。对于访问该通知的帮助,以便其他代码也可以对其做出响应,将不胜感激!

1 个答案:

答案 0 :(得分:1)

有点奇怪,这些没有记录,但是您可以在您的 UITableViewController(或 UITableViewDelegate)中定义以下函数,它们将分别在单元格拖动开始或结束时调用:

@objc func tableView(_ tableView: UITableView, willBeginReorderingRowAtIndexPath indexPath: IndexPath) {
    // Dragging started
}

@objc func tableView(_ tableView: UITableView, didEndReorderingRowAtIndexPath indexPath: IndexPath) {
    // Dragging ended
}