iOS UITableView滑动操作按钮点击后变更及确认删除实现方法
UITableView左滑删除二次确认实现方案
核心实现思路
- 新增属性记录当前处于「待确认删除」状态的行索引
- 第一次点击
Delete按钮时不执行删除逻辑,仅标记当前行为待确认状态,刷新当前行的滑动操作按钮为Confirm - 第二次点击
Confirm按钮时执行实际的删除逻辑,清空状态标记 - 增加边界处理:用户滑动其他行、点击非操作区域、收起滑动按钮时自动重置待确认状态
第一步:新增状态记录属性
在当前ViewController中添加如下属性:
// 存储待确认删除的行索引,无待确认行时为nil private var pendingDeleteIndexPath: IndexPath?
第二步:改造滑动操作代理方法
替换你原有editActionsForRowAt的实现:
override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { // 判断当前行是否为待确认删除状态 if indexPath == pendingDeleteIndexPath { // 待确认状态返回Confirm按钮 let confirm = UITableViewRowAction(style: .destructive, title: "Confirm") { [weak self] (action, indexPath) in guard let self = self else { return } // 执行实际删除逻辑 if let silinecekAktivite = self.aktivitelerListesi?[indexPath.row] { do { try self.realm.write { self.realm.delete(silinecekAktivite.odemeler) self.realm.delete(silinecekAktivite) } } catch { print("Aktiviteyi Silerken Hata Meydana Geldi : \(error.localizedDescription)") } } // 清空待确认状态 self.pendingDeleteIndexPath = nil // 刷新列表 tableView.reloadData() } return [confirm] } else { // 普通状态返回Delete按钮 let delete = UITableViewRowAction(style: .default, title: "Delete") { [weak self] (action, indexPath) in guard let self = self else { return } // 标记当前行为待确认状态 self.pendingDeleteIndexPath = indexPath // 刷新当前行,重新加载滑动操作按钮 tableView.reloadRows(at: [indexPath], with: .automatic) // 保持当前行的滑动编辑状态,避免刷新后按钮收起 DispatchQueue.main.async { tableView.setEditing(true, animated: false) } } return [delete] } }
第三步:增加边界状态处理(可选,推荐添加)
添加如下代理方法,处理用户滑动其他行、收起操作时的状态重置:
// 即将开始编辑某一行时触发 override func tableView(_ tableView: UITableView, willBeginEditingRowAt indexPath: IndexPath) { // 如果当前编辑的不是待确认行,清空之前的待确认状态 if indexPath != pendingDeleteIndexPath { let oldPending = pendingDeleteIndexPath pendingDeleteIndexPath = nil // 刷新之前的待确认行,恢复为Delete按钮 if let old = oldPending { tableView.reloadRows(at: [old], with: .automatic) } } } // 结束编辑某一行时触发 override func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?) { // 清空待确认状态 pendingDeleteIndexPath = nil } // 列表滚动时清空待确认状态 override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { pendingDeleteIndexPath = nil }
内容的提问来源于stack exchange,提问作者Begbie
相关产品推荐
相关产品推荐

