在UITableViewController中重新排序行后,UI更新不正确

时间:2017-01-14 06:55:34

标签: ios swift uitableview realm

所以我在表中重新排序行,UI结果不正确。方案如下:

最初的表格内容:

a
b
c
d
e

如果我将第0行(当前为a)移至第4行(当前为e),我看到的最终结果是:

c
d
e
a
a


一点上下文:

该表正在读取Realm对象列表。我确认Realm对象也已正确更新。如果我在重新排序行后立即放置tableView.reloadData(),我可以获得正确的UI结果。但是,重新加载数据会为我的应用带来不必要的UI动画。下面是我执行重新排序的代码:

let realm = try! Realm()
realm.beginWrite()
let itemToMove = self.itemList?[fromIndexPath.row]
self.itemList?.remove(at: fromIndexPath.row)
self.itemList?.insert(itemToMove!, at: toIndexPath.row)
try realm.commitWrite()


我在没有读取Realm对象的表中重新排序行的成功经验。所以我不确定这是否与Realm有关。我已经研究了很多,但没有真正看到任何类似的问题。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:4)

因此,关于作为表视图数据源的Realm对象的棘手问题是,我需要协调Realm对象的更新(通知通知令牌)以及表视图当重新排序发生时。

从官方的Realm Swift文档中,记录了一个使用 commitWrite(withoutNotifying: [token]) 更新Realm对象的功能。我有点挣扎,直到我发现这是最近发布的一个新功能,我的Realm版本有点过时了。这就是为什么当我输入该功能时,Xcode抱怨。安装Realm 2.2.0后,该功能立即显示出来。

以下是重新排序行的代码:

do {
    self.itemList?.realm?.beginWrite()

    self.itemList?.move(from: fromIndexPath.row, to: toIndexPath.row)
    self.tableView.moveRow(at: fromIndexPath, to: toIndexPath)

    try self.itemList?.realm?.commitWrite(withoutNotifying: [self.notificationToken])
} catch let error as NSError {
    fatalError(error.localizedDescription)
}

对问题的一点跟进:
表视图中奇数行的背景颜色最初设置为灰色(只是一些UI功能)。但是,重新排序后,将不会更新正在移动的行的背景颜色。我尝试使用tableView.reloadData()tableView.reloadRows()。但是最后一行以某种方式结束了一个奇怪的状态,在那里它不能再被编辑了。所以基本上如果我想再次对表重新排序,最后一行将不会显示在“编辑”状态/视图中。我仍在努力理解并解决这个问题。