Swift 4中如何用UIDocument删除文件及排查打开失败原因
Hey there! 针对你提出的两个UIDocument相关问题,我整理了具体的实现方案和代码示例,帮你解决这些需求:
1. 如何使用UIDocument删除文件
UIDocument本身并没有提供直接删除文件的API,我们需要结合FileManager来完成操作,但要注意必须先确保文档处于关闭状态,否则可能出现文件占用的问题。具体步骤如下:
- 先检查当前文档是否处于打开状态,如果是,先调用
close(completionHandler:)关闭它 - 关闭完成后,使用
FileManager.default.removeItem(at:)删除对应的文件URL - 记得处理可能出现的错误(比如文件不存在、权限问题等)
示例代码:
// 确保我们有有效的文件URL和文档实例 guard let fileURL = falloutFileHandler?.fileURL, let handler = falloutFileHandler else { print("无效的文档实例或URL") return } // 如果文档处于打开状态,先关闭 if handler.documentState.contains(.normal) { handler.close { [weak self] success in guard let self = self else { return } if success { self.performFileDeletion(at: fileURL) } else { print("关闭文档失败,无法删除") } } } else { // 文档已经关闭,直接执行删除 performFileDeletion(at: fileURL) } // 封装删除操作的辅助方法 private func performFileDeletion(at url: URL) { do { try FileManager.default.removeItem(at: url) print("文件删除成功:\(url.path)") // 删除后建议将文档实例置为nil,避免后续误操作 falloutFileHandler = nil } catch { print("文件删除失败,错误信息:\(error.localizedDescription)") // 如需更详细的错误调试信息,可以直接打印error本身 // print("详细错误详情:\(error)") } }
2. 获取文件打开失败的具体错误信息
你当前使用的open(completionHandler:)闭包仅返回成功状态,无法捕获错误详情。其实UIDocument提供了另一个重载的open方法,它的闭包会携带Error?参数,我们可以用这个版本来获取具体的失败原因:
修改后的打开文件代码:
falloutFileHandler?.open(completionHandler: { [weak self] success, error in guard let self = self else { return } if success { if let theText = self.falloutFileHandler?.falloutFile?.data { self.textView.text = theText // 注意你原代码里写了self.text!,这里应该是笔误,我帮你修正为读取到的内容,如果不是笔误可以改回 } else { print("文档内容为空或读取失败") } } else { // 这里可以拿到具体的错误信息 if let openError = error { print("打开文件失败,错误信息:\(openError.localizedDescription)") // 打印完整错误栈,方便调试定位问题 print("详细错误详情:\(openError)") } else { print("打开文件失败,但未获取到具体错误") } } })
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

