【发布时间】:2019-01-07 18:51:13
【问题描述】:
我正在使用trailingSwipeActionsConfigurationForRowAtUITableView的委托方法来处理用户滑动删除某些单元格(项目)时的处理。
我的UIContextualAction 用于删除事件 看起来像这样。我首先从 Realm 数据库中删除项目,然后从表视图中删除行
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let deleteAction = UIContextualAction(style: .destructive, title: nil) { _,_,_ in
Repository.shared.deleteItem(self.items![indexPath.row])
tableView.deleteRows(at: [indexPath], with: .fade)
}
...
}
但是由于某种原因,当我删除单元格时,它并没有立即删除,而是返回到滑动之间的位置。然后当我滚动表格视图时,单元格消失了,就像你在下面的 gif 中看到的那样:
我可以通过在从数据库中删除某些项目后立即重新加载表格视图的数据来“修复”这个问题,但这不是我想要的,我想使用 deleteRow(at:with:) 因为动画。
我的一个猜测是,它与从 Realm 数据库中删除项目有关。
我正在使用delete 方法删除项目
func deleteItem(_ item: Item) {
do {
try realm.write {
realm.delete(item)
}
} catch {
print(error)
}
}
然后作为我的表格视图的数据源数组,我使用 Realm 的 Results
var items: Results<Item>?
有人知道为什么会这样吗?谢谢。
【问题讨论】:
-
一种选择是将 Realm 观察者添加到您的结果数据集中。因此,当您从领域中删除对象时,您的应用会收到该事件的通知,并可以相应地更新 UI。它还与添加或编辑密切相关——观察者闭包接收这些事件并可以处理它们。使 UI 保持新鲜并不断更新。
-
你在哪里打电话
realm.delete?您只显示删除表格视图行的代码,但实际上并未显示您修改数据源的位置。 -
@DávidPásztor 这只是在 do-try-catch 块中调用
realm.delete(item)的方法 -
@Jay 好的,这个主意不错。谢谢你的建议。
-
您是否尝试在调用
deleteRows之前和之后添加beginUpdates()和endUpdates()?
标签: swift uitableview realm uicontextualaction uiswipeactionsconfiguration