所以我在表中重新排序行,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有关。我已经研究了很多,但没有真正看到任何类似的问题。任何帮助将不胜感激!
答案 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()
。但是最后一行以某种方式结束了一个奇怪的状态,在那里它不能再被编辑了。所以基本上如果我想再次对表重新排序,最后一行将不会显示在“编辑”状态/视图中。我仍在努力理解并解决这个问题。