关于重新排序 tableView 的问题(Apple Swift 和 Xcode 11)

Posted

技术标签:

【中文标题】关于重新排序 tableView 的问题(Apple Swift 和 Xcode 11)【英文标题】:Question about Reorder the tableView (Apple Swift and Xcode 11) 【发布时间】:2020-06-26 07:10:28 【问题描述】:

我刚开始学习名为 APP Development with Swift 的 Apple Book。我发现了一个关于重新排序 tableView 的困惑点,这是由 Apple Book 编写的。

代码如下: Emoji 是 struct,emojis 是 var,emojis:[Emoji]

override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) 

    let movedEmoji = emojis.remove(at: fromIndexPath.row)
   
    emojis.insert(movedEmoji, at: to.row)
 
    tableView.reloadData()

我的困惑是:即使我删除了“override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath)”里面的代码,我仍然可以使用按钮进入编辑条件,然后使用 Re-order 控件向上或向下移动项目。那么,中间的代码有什么用呢?我的意思是下面的代码:

    let movedEmoji = emojis.remove(at: fromIndexPath.row)
   
    emojis.insert(movedEmoji, at: to.row)
 
    tableView.reloadData()

我认为代码只是在tableview中移动item,就像先删除然后插入一样,所以没有必要吗?

【问题讨论】:

你明白emojis数组作为table view的数据源,应该和table view显示的内容保持一致吗? @ficoman 您所指的表情符号是一个数组,它是您的数据源,因此当您重新排序 tablview 时,数组也应该更新。因此,例如,您将第 4 行移动到第 2 行,您还需要更改表情符号数组的位置。如果您有很长的表情符号列表,并且您向上滚动并返回到该位置,则它不会反映您是否已更新数据源。 问题已解决。谢谢大家。 【参考方案1】:

UITableViews 仅显示其数据源的一部分,即屏幕上可见的部分。当新单元格出现时,它会通过cellForRowAt 询问其数据源应该显示哪个单元格。要使表格视图按预期工作,数据源必须知道表格视图显示的内容,才能正确回答。

这就是为什么表格视图必须告诉数据源用户已经移动了它的一个单元格(通过moveRowAt)。如果数据源不知道这一点,并且仍然认为没有移动任何内容,那么下次显示表格视图的该部分时,数据源将回答旧的、未移动的数据。

示例:尝试删除moveRowAt 中的代码。向数据源添加更多表情符号,即emojis,以便您可以将表格视图向下滚动很远。运行应用程序。交换第一个和第二个表情符号。滚动到底部并再次向上滚动。这将导致表格视图询问数据源“我应该显示的第一个单元格是什么?”和“我应该显示的第二个单元格是什么?”。由于数据源不知道前两个单元格已被交换,因此您将按照原始顺序看到两个单元格,就好像您的移动已撤消一样。

这就是为什么在moveRowAt 中,您还需要移动emojis 数组中的元素。这样,emojis 实际上存储了屏幕上显示的内容。

至于reloadData 电话,我认为这主要是为了安全。就像前两行将数据源与视图同步一样,reloadData 将视图与数据源同步,以防出于某种奇怪的原因。

【讨论】:

谢谢,我是这么想的,但是因为我的表情只有5个,所以我看不到。我添加了更多,发现它真的像你说的那样。非常感谢。

以上是关于关于重新排序 tableView 的问题(Apple Swift 和 Xcode 11)的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSCoding 保存 TableView 单元格的重新排序

TableView 中的重新排序行将在数据刷新后重置为默认值

重新排序 TableView 和节标题高度变为零时数据源不更新

无法重新排序 tableView 单元格图像

重新排序 TableView 时如何更改 CoreData 的索引?

如何在 swift 中使用 fetchedresultscontroller 重新排序 tableview 行?