簡體   English   中英

迅速的iOS:在應用程序文檔文件夾中創建UIDocument

[英]swift iOS: create UIDocument in app documents folder

我正在尋找一種方法。 我說選項如何使用已創建但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)
            }
        })

網址是:

/var/mobile/Containers/Data/Application/67C2A474-A054-4DFE-8587-B453A8B44554/Documents/Untitled.UTI

我在字符串上崩潰:“讓文檔= 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(fileURLWithPath: self)而不是URL(string: self)因為這是本地文件。

您用於創建路徑和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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM