因此,我对表中的行重新排序,用户界面最终结果不正确。场景如下:
表内容原文:
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 有关。我已经研究了很多,但没有真正看到任何类似的问题。任何帮助将不胜感激!
因此,Realm 对象作为表视图的数据源的棘手之处在于,我需要协调 Realm 对象的更新(without发生重新排序时通知通知令牌)以及表视图。
从官方 Realm Swift 文档中,记录了一个功能来使用更新 Realm 对象commitWrite(withoutNotifying: [token])
。我经历了一些挣扎,直到我发现这是最近发布的新功能,而我的 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()
and tableView.reloadRows()
。但最后一行不知何故以一种奇怪的状态结束,无法再编辑。所以基本上,如果我想再次对表重新排序,最后一行将不会显示在“编辑”状态/视图中。我仍在尝试理解并解决这个遗留问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)