3

我一直在为基于文档的 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 权限的事情,但我认为我已经适当地设置了这些权限。

它似乎在模拟器中工作正常,但在设备上运行时却不行。

重命名应用程序容器中文件的正确方法是什么?

4

0 回答 0