[英]Row in UITableView isn't deleted immediately
我正在使用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)
}
}
然后作為我的表視圖的數據源數組,我正在使用 Realm 的Results
var items: Results<Item>?
有人知道為什么會這樣嗎? 謝謝你。
我正面臨着你遇到的問題。 我也在使用 Realm,並且還使用了Results<Item>
作為我的 tableView 數據源。
我在tableView(_:, trailingSwipeActionsConfigurationForRowAt:)
方法中的滑動到刪除單元的實現與你的完全相同:刪除realm.write{}
塊中的滑動項,然后調用UITableView.deleteRows(at:with:)
方法更新 tableView。 無需更新數據源items
因為 Realm Results<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+)
}
...
}
這解決了我的問題,希望它也適用於您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.