如何重新排序 UITableView 的各个部分?

Posted

技术标签:

【中文标题】如何重新排序 UITableView 的各个部分?【英文标题】:How to reorder sections of a UITableView? 【发布时间】:2018-10-27 19:11:54 【问题描述】:

This question from 2009 没有得到答复,这是互联网上极少数提及此问题的问题之一。

问题:我想重新排序 UITableView 的各个部分,就像我对行所做的一样(即,通过拖动)。

我看到这个工作的方式是:您打开表格上的编辑,重新排序指示器出现。当您开始拖动节标题(或充当伪节标题的单元格,这是次优 [1])时,所有常规单元格“消失”,因此您只能移动节(如果您更容易有多个部分)。

LPRTableView 似乎解决了这个问题,但是在重新排序部分时正确设置是相当棘手的。我尝试了一整天,但没有很成功。另外,[1]。

一个不太好但可以接受的解决方案是在标题中添加⬆️⬇️之类的按钮(此处可以使用正确的标题),但这有点尴尬。

另一个不太好但可以接受的解决方案是有一个额外的步骤(比如一个按钮),它会打开一个新的 UITableView,只将部分显示为单元格,并允许在那里重新排序。工作正常,但产生的问题多于解决的问题 [2]。

我在the docs 中看不到任何内容,例如,在重新排序开始/结束时调用的挂钩。或者更确切地说,有ending 位,但我看不到开头的位。

建议?


[1] 原则上,这允许将行放置在节标题之前,您必须手动捕捉它,视觉效果不好。

[2] 我什至会在哪里放置这样的控件,尤其是如果我的 UI 已经很拥挤,或者我想保持我的 UI 最小化?

【问题讨论】:

可能相关:***.com/questions/24564810/… 我看到了,但它不允许我将单元格从一个部分移动到另一个部分。 你试过 func moveSection(_ section: Int, toSection newSection: Int) 吗? 可以,但是无法拖放这些部分。如果我有向上和向下按钮,那么我会在 之后使用该功能。 UITableView 控件没有提供“内置”标准方法来执行此操作,因此您需要自己手工制作。查看@AhmadF 提供的链接,您可以尝试使用点击手势或平移手势来启动和控制部分的移动。 【参考方案1】:

我会折叠所有部分并仅将 sectionHeaders 显示为 UITableViewCells。然后我会用默认的拖放行为重新排列它们。完成后,将旧的未折叠信息加载回表格视图单元格。

那么您就不必考虑动画并遵守“ios 指南”。

【讨论】:

我正在考虑这样做,但问题仍然是我如何触发该功能。它必须易于发现(即,不要长时间点击标题或其他晦涩的手势),并且不能使 UI 混乱(排除某处的按钮)。 可能有披露指示符,但在部分标题中指向上方?或者只是一个编辑栏按钮项目会更容易。【参考方案2】:

借助假截面,您可以点击并拖动该截面视图。有两个步骤:

    首先让委托识别 uitableview 的哪个部分是 在你点击下(我希望你能做到这一点,我不会进入 详情)。

    而不是将其放到必须替换的部分。因此对于 替换我脑子里也有两个想法。

    首先播放视图 层次结构 顶部是什么,下面是什么,而不是借助标记或 别的东西得到你下面的部分替换假部分。

    第二个可能是找到可见单元格而不是计算 屏幕位置可能是这里的部​​分。

当您可以实现这一点时,您拥有这两个部分,您可以在数据源中替换这两个部分,然后再次加载数据。

【讨论】:

这就是 LPRTableView 所做的。我试过了,但是设置部分非常棘手(请参阅我的 OP 中提到的)。 不要使用 LPRTableView 你可以自己做它不是我认为的那么棘手。如果您对 tableview 不是那么好,那可能是个问题。让我看看 LPRTableView,如果我找到了我会回复你的。

以上是关于如何重新排序 UITableView 的各个部分?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用删除按钮在 UITableView 中显示重新排序控件

如何制作像 UITableView 一样的动画重新排序单元格?

在没有重新排序控制的情况下重新排序 UITableView

使用 Core Data 时如何重新排列部分

用户单击 UITableView 中的单元格进行重新排序,我如何知道被拖动单元格的索引和位置?

更改 UITableView 中重新排序图标的颜色