首页 > 解决方案 > 使用 TrailingSwipeActionsConfigurationForRowAt 删除单元格时出现一些奇怪的动画错误

问题描述

我正在尝试使用 tableView 的这种方法简单地删除单元格。出于某种原因,这样做会产生我无法弄清楚的奇怪动画错误。这是我的代码:

let deleteSubcatAction = UIContextualAction(style: .destructive, title: "Delete") { (action, view, handler) in
    print("Delete Subcategory Action Tapped")
    let subcategory = Global.budget.categories[indexPath.section].subcategories[indexPath.row]
    Global.budget.categories[indexPath.section].subcategories.remove(at: indexPath.row)
    tableView.deleteRows(at: [indexPath], with: .left) }
    
deleteSubcatAction.backgroundColor = .red
let rowConfig = UISwipeActionsConfiguration(actions: [deleteSubcatAction])
return rowConfig

当我将单元格拖到左侧时,我看到了预期的删除操作,并且按下该操作会调用该方法。但是,该单元格不会从表格中删除。相反,动作保持锁定,单元格的其余内容滑回右侧,就好像我没有按下动作就松开了手指一样。然后,如果我在我的应用程序中点击其他地方,动作会最小化回到右侧,并且单元格会消失而没有任何类型的删除动画。这是我记录的错误的视频。这里发生了什么?

标签: iosswiftuitableview

解决方案


弹出的第一件事是您没有在闭包handler结束时调用完成处理程序(在您的情况下是属性) 。UIContextualAction如中,handler(true)

第二件事是您没有做任何事情来确保动作在表格视图中正确动画。执行此操作的非侵入式方法(无需从数据源重新加载整个表视图)是使用:

tableView.beginUpdates()
tableview.endUpdates()

有关更多信息,请参阅 API 文档

PS 理想情况下,您应该让您的数据源连接到您的表格视图,以便表格视图对数据源的观察者触发的事件做出反应,而不是“手动”删除表格行以响应 UI 操作。


推荐阅读