我试图使用-[UIDocument saveToURL:(NSURL *)url forSaveOperation:(UIDocumentSaveOperation)saveOperation completionHandler:(void (^ __nullable)(BOOL success))completionHandler]在一个新的URL上保存一个副本,但是当这样做时,原始文件-[UIDocument fileURL]被删除了吗?
发布于 2022-01-25 10:09:24
我找不到任何有关这方面的文档,但它似乎是有意的。¯\_(ツ)_/¯这里是iOS 15.2的Hopper反汇编:

发布于 2022-09-02 07:59:52
是的,UIDocument就是这么做的。好痛啊。
如果要将UIDocument保存到新的URL而不丢失原始URL,则可以使用如下函数进行保存:
func saveDocument(_ document: UIDocument, asCopyTo url: URL, completion: @escaping (Bool, Error?) -> Void) {
let oldUrl = document.fileURL
document.save(to: url, for: .forOverwriting) { success in
if success {
do {
try FileManager.default.copyItem(at: url, to: oldUrl)
} catch let error {
completion(false, error)
}
}
completion(success, nil)
}
}这首先将现有文档保存在其新的url中,更新fileURL,使UIDocument对象保持当前状态,并且不再继续保存旧文件。一旦完成,并假设它成功,我们将使用FileManager将新文件的数据复制回原来的位置。
在文件的原始位置删除和重新创建文件似乎很奇怪,我同意UIDocument是一个非常可怕的创建,但这至少可以避免您不得不从文件系统重新加载文档来维护正确的位置。
https://stackoverflow.com/questions/70846786
复制相似问题