因此,我在对表中的行进行重新排序时,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有关。我已经研究了很多,但并没有真正看到任何类似的问题。任何帮助将不胜感激!
因此,将Realm对象用作表视图的数据源时,棘手的事情是,在重新排序时,我需要协调Realm对象的更新(不通知通知令牌)以及表视图。
从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()
和tableView.reloadRows()
。但是最后一行以某种怪异的状态结束了,无法再对其进行编辑。因此,基本上,如果我想再次对表格重新排序,则最后一行将不会显示在“编辑”状态/视图中。我仍在尝试理解并解决剩余的问题。