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

