1

trailingSwipeActionsConfigurationForRowAt UITableView当用户滑动删除某些单元格(项目)时,我正在使用的委托方法进行处理。

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)
    }
}

然后作为我的表视图的数据源数组,我使用的是 RealmResults

var items: Results<Item>?

有人知道为什么会这样吗?谢谢你。

4

1 回答 1

0

我正面临着你所遇到的问题。我也在使用 Realm,我也用作Results<Item>我的 tableView 数据源。

我在方法中对 swipe-to-delete-cell 的实现tableView(_:, trailingSwipeActionsConfigurationForRowAt:)与您的完全相同:删除realm.write{}块中的滑动项,然后调用UITableView.deleteRows(at:with:)方法来更新 tableView。无需更新数据源items,因为 RealmResults<T>会自动更新。

一切在 iOS 13 及更高版本上运行良好,但是当我在 iOS 12.4、iPhone 6 模拟器上对其进行测试时,我遇到了与您在问题中描述的相同的问题。

看这篇文章的时候想到了一个解决办法,原来你需要做的就是在完成更新后调用 UIContextualAction.Handler 中提供的完成处理程序,请参考下面的代码:

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let deleteAction = UIContextualAction(style: .destructive, title: "Delete") { _, _, completion in
        Repository.shared.deleteItem(self.items![indexPath.row])  // delete item from Realm
        tableView.deleteRows(at: [indexPath], with: .fade)  // update tableView
        completion(true) // notify the tableView that the swipe action has completed so now it can perform UI updates (this line is no longer needed on iOS 13+)
    }
    ...
}

这解决了我的问题,希望它也适用于你。

于 2020-05-25T00:26:05.440 回答