我一直在为基于文档的 SwiftUI 应用程序使用新模板。虽然您在新模板中“免费”获得了很多文件管理,但在 iOS 版本中,用户必须退出文件到文件浏览器才能更改文件名。我想为用户创造机会在文件打开时重命名文件。
这是一个专注于该问题的示例项目:https ://github.com/stevepvc/DocumentRenamer
在代码中,我在模板代码中添加了一个带有文本字段的简单 UI,供用户输入新名称。当用户点击“重命名”按钮时,应用程序会检查具有该名称组件的 URL 是否可用,并在必要时附加后缀以创建目标 URL。
func getTargetURL() -> URL {
let baseURL = self.fileurl.deletingLastPathComponent()
print("filename: \(self.filename)")
print("fileURL: \(self.fileurl)")
print("BaseURL: \(baseURL)")
var target = URL(fileURLWithPath: baseURL.path + "/\(filename).exampletext")
var nameSuffix = 1
while (target as NSURL).checkPromisedItemIsReachableAndReturnError(nil) {
target = URL(fileURLWithPath: baseURL.path + "/\(filename)-\(nameSuffix).sermon")
print("Checking: \(target)")
nameSuffix += 1
}
print("Available Target: \(target)")
return target
}
然后它会尝试重命名文件,这就是我被卡住的时候。我尝试了几种方法,最近的方法如下:
func changeFilename(){
let target = getTargetURL()
var rv = URLResourceValues()
let newFileName = target.deletingPathExtension().lastPathComponent
rv.name = newFileName
do {
if fileurl.startAccessingSecurityScopedResource(){
try fileurl.setResourceValues(rv)
fileurl.stopAccessingSecurityScopedResource()
}
} catch {
print("Error:\(error)")
}
}
但我不断收到以下错误:
Domain=NSCocoaErrorDomain Code=513 "您没有将文件 "Untitled" 保存在文件夹 "DocumentRenamer" 中的权限。"
我也试过这个没有 startAccessingSecurityScopedResource() 检查,或者尝试创建一个帮助器类,如下所示:
class FileMover: NSObject {
func moveFile(originalURL: URL, updatedURL:URL) -> Bool {
let coordinator = NSFileCoordinator(filePresenter: nil)
var writingError: NSError? = nil
var success : Bool = true
print("moving file")
coordinator.coordinate(writingItemAt: originalURL, options: NSFileCoordinator.WritingOptions.forMoving, error: &writingError, byAccessor: { (coordinatedURL) in
do {
try FileManager.default.moveItem(at: coordinatedURL, to: updatedURL)
success = true
print("file moved")
} catch {
print(error)
success = false
}
})
return success
}
}
但是使用这种方法会完全锁定应用程序。那里可能有一些关于 iCloud 权限的事情,但我认为我已经适当地设置了这些权限。
它似乎在模拟器中工作正常,但在设备上运行时却不行。
重命名应用程序容器中文件的正确方法是什么?