UITableView中的行不会立即删除

时间:2019-01-07 18:51:14

标签: swift uitableview realm uicontextualaction uiswipeactionsconfiguration

我正在使用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中看到的一样:

enter image description here

从数据库中删除某些项目后,我可以通过重新加载表视图的数据来“修复”此问题,但这不是我想要的,由于动画我想使用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>?

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

1 个答案:

答案 0 :(得分:0)

我正好面对您遇到的问题。我也使用Realm,也使用Results<Item>作为tableView数据源。

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

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

在阅读this article时我想出了一个解决方案,事实证明,您需要做的就是完成更新后调用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+)
    }
    ...
}

这解决了我的问题,希望它也对您有用。

相关问题