You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:45:03