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

Swift音频录制器:音频文件删除功能代码问题咨询

问题分析与修复方案

Hey,我帮你拆解下这段删除代码里的几个关键问题,这些正是导致功能失效或异常的原因:

1. 错误被静默吞掉,无法定位问题

你用了try? FileManager.default.removeItem(at: path),这个写法会把所有删除相关的错误(比如文件不存在、权限不足、路径错误等)全部忽略,导致catch块永远不会触发——就算删除失败,你也看不到任何错误提示,根本不知道问题出在哪。应该改用try来抛出错误,这样才能进入catch块捕获真实的异常信息。

2. 未更新数据源,TableView刷新后数据混乱

你只调用了myTableView.reloadData(),但没有从你的录音数据源数组中移除对应的条目。比如你肯定有一个类似recordings: [URL]或者recordingNames: [String]的数组用来存储所有录音的信息,删除文件后必须先把这个数组里对应indexPath的元素删掉,再刷新TableView,否则下次加载时数据还是旧的,甚至会因为索引不匹配触发新的崩溃。

3. 用行号生成文件名的逻辑存在致命缺陷

你通过indexPath.row + 1生成文件名(比如Recording1.m4a),但删除行后,后续行的索引会发生变化。比如你删除第2行(对应Recording2.m4a),原来的第3行现在变成第2行,下次删除时会错误地尝试删除Recording2.m4a(已经被删了),而真正要删的Recording3.m4a却没被处理。正确的做法是把每个录音的实际路径直接存在数据源数组里,而不是动态生成。


修正后的代码示例

假设你的数据源是一个保存录音路径的数组var recordingPaths: [URL] = [],修正后的代码如下:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        // 从数据源获取真实的目标路径,而非动态生成
        let targetPath = recordingPaths[indexPath.row]
        
        do {
            // 使用try抛出错误,让catch能捕获异常
            try FileManager.default.removeItem(at: targetPath)
            // 先更新数据源,这是核心步骤
            recordingPaths.remove(at: indexPath.row)
            // 用deleteRows做局部刷新,比reloadData更高效
            tableView.deleteRows(at: [indexPath], with: .automatic)
        } catch {
            // 打印错误详情方便调试,同时给用户提示
            print("删除失败原因:\(error.localizedDescription)")
            displayAlert(title: "OOPS", message: "Delete failed: \(error.localizedDescription)")
        }
    }
}

额外调试建议

  • 在删除前先打印targetPath,确认要删除的文件路径是否和实际存储的路径一致。
  • 检查getDirectory()返回的是否是正确的沙盒目录(比如App的Documents目录),避免路径根目录错误。

内容的提问来源于stack exchange,提问作者thaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:37:34