在 UITableView 中拖放整个部分而不是单行

Posted

技术标签:

【中文标题】在 UITableView 中拖放整个部分而不是单行【英文标题】:Drag & Drop entire section instead of single row in UITableView 【发布时间】:2019-04-28 07:50:21 【问题描述】:

我正在使用UITableView 来显示几个部分,它们代表一个待办事项,每个部分都有几行,代表一个较小的待办事项:

- Finish thesis
-- Interview representatives
-- Rewrite chapter 8
-- Create cover sheet

- Clean the house
-- Do the dishes
-- Mop living room
-- Clean windows in bathroom

我已经成功实现了一种使用UITableViewDragDelegateDropDelegate 重新排列行的方法。我确保一切都是可移动的(协议canMoveRowAt 返回真)。为了让您了解我是如何做到这一点的:

func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] 

    let toDoName = toDoList[indexPath.section].toDoItem[indexPath.row].toDoName
    let itemProvider = NSItemProvider(object: toDoName as NSString)
    let dragItem = UIDragItem(itemProvider: itemProvider)
    dragItem.localObject = item
    return [dragItem]


MoveRowAt() 中,我确保相应地更改数据,从sourceIndexPath 中删除数据并将其插入destinationIndexPath。这很好用。

但是,我想让部分也可拖动 - 以便按优先级对待办事项列表进行排序。例如,如果我添加一个新的待办事项,它会自动附加到底部,但也许这是需要首先完成的重要事情,所以我希望它 - 作为一个包含所有行的部分 - 被向上拖动如果需要。

我可以用同样的方法完成吗?我发现没有行协议(moveRowAt 存在,但 moveSectionAt 不存在,canMoveSectionAt 相同)。

我找到了一个函数,tableView.moveSection(section, toSection: section),我可能需要使用它。但是我将如何实现拖放并将其附加到该部分的标题?我需要使用自定义UILongPressGestureRecognizer 吗?有关如何完成此操作的任何提示或可用库?

【问题讨论】:

【参考方案1】:

我不知道是否可以拖放整个部分,但可能不会,现在 API 可以同意拖放行;您可以做的一件事是在每个 Item 中创建一个带有 tableView 的 CollectionView,这样您就可以拖放包含您的 tableView 的 Item

【讨论】:

可能是一个解决方案,但我不认为将多个 TableView 用作 CollectionView 的行的理想方案。我希望有另一种方法——否则我将不得不研究它。 是的,这可能不是最好的解决方案,但这是我唯一想到的!如果您发现其他内容,请告诉我,因为我对此感到好奇 最后,我最终在我的部分中使用了向上和向下箭头,然后调用 moveSection。不完全是我所希望的,但它工作正常。如果我找到了使用拖放移动部分的好方法,我会告诉你的。 同时我开发了一个应用程序,通过拖放来制作足球比赛阵容,您可以通过简单的手势交换球员,它是坐标和事件状态的组合,实现起来并不难 欢迎分享一些代码。当你拖出屏幕时它也有效吗?

以上是关于在 UITableView 中拖放整个部分而不是单行的主要内容,如果未能解决你的问题,请参考以下文章

我在使用 Unity 在 VR 中拖放对象时遇到问题

用于 Silverlight 中拖放的 TranslateTransform

在“ListView”中拖放

在android中拖放textview

从 NSOutlineView 中拖放

在 Jquery 中拖放 html 数据