当前位置:  开发笔记 > IOS > 正文

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

如何解决《UITableViewController中的行重新排序后,UI更新不正确》经验,为你挑选了1个好方法。

因此,我在对表中的行进行重新排序时,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> cafemike..:

因此,将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()。但是最后一行以某种怪异的状态结束了,无法再对其进行编辑。因此,基本上,如果我想再次对表格重新排序,则最后一行将不会显示在“编辑”状态/视图中。我仍在尝试理解并解决剩余的问题。

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有