Swift IOS:在App Documents文件夹中创建UIDOCUMENT



我正在寻找一种方法。我说的是如何使用Alredy创建的文件,但UIDocument不能仅从URL初始化。

所以,这是我的代码,它不起作用:

        weak var weakSelf = self
        let toFolder = presenter.interactor.url.path
        let name = "Untitled"
        var toPath = toFolder + "/" + name
        var count = 1
        while FileManager.default.fileExists(atPath: toPath) {
            toPath = toFolder + "/" + name + " ((count))"
            count += 1
        }
        let url = (toPath + ".UTI").url!
        print(url.absoluteString)
        let document = Document(fileURL: url)
        document.save(to: url, for: UIDocument.SaveOperation.forCreating, completionHandler: { (success) in
            if success {
                vc.document = document
                vc.title = url.lastPathComponent
                let nvc = UINavigationController(rootViewController: vc)
                weakSelf?.userInterface.present(nvc, animated: true, completion: nil)
            } else {
                Alert.showError(body: "Could not create document".localized)
            }
        })

url是:

/var/mobile/containers/data/application/67c2a474-a054-4dfe-8587-b453a8b44554/documents/untitled.uti

我已经在字符串上崩溃了:"让document = document(fileurl:url)"

***终止由于未知的例外" nsinvalidargumentException"终止应用程序,原因是:'必须将有效的文件URL传递给 - [uidocument initwithfileurl:]'

类文档:

enum DocumentError: Error {
case saveError
case loadError
}
class Document: UIDocument {
var text: String?
var encodingUsed: String.Encoding?
override func contents(forType typeName: String) throws -> Any {
    guard let data = text?.data(using: .utf8) else {
        throw DocumentError.saveError
    }
    return data
}
override func load(fromContents contents: Any, ofType typeName: String?) throws {
    guard let data = contents as? Data else {
        throw DocumentError.loadError
    }
    guard let utf8 = String(data: data, encoding: .utf8) else {
        throw DocumentError.loadError
    }
    self.text = utf8
}

}

var url: URL? {
    if self != "" && !isEmpty {
        return URL(string: self)
    } else {
        return nil
    }
}

您用于创建路径和URL的代码需要大量工作。但是最后,您需要使用URL(fileURLWithPath:)创建文件URL并将其传递给您的Document

let toFolder = presenter.interactor.url
let name = "Untitled"
var toPath = toFolder.appendingPathComponent(name)
var count = 1
while FileManager.default.fileExists(atPath: toPath.path) {
    toPath = toFolder.appendingPathComponent(name + " ((count))")
    count += 1
}
let url = toPath.appendingPathExtension("UTI")
print(url.path)
let document = Document(fileURL: url)

您的扩展程序应返回:URL(fileURLWithPath: self)不是URL(string: self),因为这是本地文件。

最新更新