Ios Swift-在一个tableView节中移动一行会导致重新加载其他节的标题

Ios Swift-在一个tableView节中移动一行会导致重新加载其他节的标题,ios,swift,uitableview,firebase,firebase-realtime-database,Ios,Swift,Uitableview,Firebase,Firebase Realtime Database,这是一个很长的一个,所以我感谢你的时间!我在UITableView的特定部分中重新排序行时遇到问题 上下文:我有一个包含多个部分的UITableView(.plain style)。第0节显示了大量信息。第1节列出了喜欢某些内容的用户。第2部分是另一个不喜欢某些内容的用户列表。第3节是用户生成的评论列表。表中的每个单元格和标题视图都是从NIB启动的自定义类。我允许用户根据受欢迎程度对评论进行排序。当用户点击排序按钮时,调用以下函数: func sortOnPopular() { if

这是一个很长的一个,所以我感谢你的时间!我在UITableView的特定部分中重新排序行时遇到问题

上下文:我有一个包含多个部分的UITableView(.plain style)。第0节显示了大量信息。第1节列出了喜欢某些内容的用户。第2部分是另一个不喜欢某些内容的用户列表。第3节是用户生成的评论列表。表中的每个单元格和标题视图都是从NIB启动的自定义类。我允许用户根据受欢迎程度对评论进行排序。当用户点击排序按钮时,调用以下函数:

func sortOnPopular() {

    if self.comments.isEmpty {
        return
    }

    self.table.scrollToRow(at: IndexPath(row: 0, section: self.COMMENT_SEC), at: .top, animated: true)

    //FIREBASE method
    //returns a child from a node on the database that is sorted
    //according to the parameter passed to it. The function returns
    //each child one by one according to its rank in the sort.
    _ = ref.child("not really important...").queryOrdered(byChild: "not important also").observe(.childAdded, with: { (snapshot) in

        //Gets the index, i, of the sorted comment in the model, keys.
        if let i = self.keys.index(of: snapshot.key) {
            self.table.beginUpdates()
            self.table.moveRow(at: IndexPath(row:i, section: self.COMMENT_SEC), to: IndexPath(row:0, section:self.COMMENT_SEC))
            self.keys.remove(at: i)
            self.keys.insert(snapshot.key, at: 0)
            self.table.endUpdates()
        }
    })
}
问题:当我在表视图中只有一个部分时,这段代码曾经工作得很好。一旦我添加了多个,当调用这个函数时,表视图就会做一些奇怪的事情。例如,主内容显示(第0节)会显示为重新加载。用户点击第0节中的排序按钮后,其颜色将更改为橙色。按钮将在短时间内保持橙色,但一旦完成排序,它将恢复为其原始颜色。它应该保持橙色,直到用户再次点击按钮。调用此函数时,第0节中的图像似乎也会被重新下载。第0节标题的背景是视觉效果暗模糊视图;当调用此函数时,它不再模糊-它似乎是一个稍微透明的黑色视图。此外,当调用此函数时,所有标头都会向上移动,然后返回到其原始位置

基于所有这些,我认为这个函数以某种方式导致表视图重新加载其所有部分和行

问题:

(1) 调用tableView.moveRow(at:to:)是否重新加载整个tableView?如果是,是否有办法将更新限制到特定的部分

(2) 文档中没有说明必须使用tableView.BeginUpdate()和.EndUpdate(),除非插入或删除行。这里有必要吗

(3) 将行插入到tableView还会产生上述有关UIVisualEffectView呈现的结果。有人有过这样的经历吗


谢谢你的耐心和任何建议

> p>您的代码看起来很好,但是我们可能需要考虑单元格超出视图区域和重用单元格的情况。

我观察到,当我们使用

tableView.moveRow(在:,到:)

或者当我们使用

tableView.scrollToRow(at:,at:UITableViewScrollPosition.top,动画:true)

在单元重用期间,结果也不一致

因此,最好使用

reloadSections(sections:IndexSet,带动画:UITableViewRowAnimation)

在整理数据之后。这将重新加载该部分并避免重复使用单元的麻烦

希望这有帮助