与 UIDocumentInteractionController 共享文档

问题描述

我正在尝试使用 UIDocumentInteractionController 共享存储在临时目录中的文档。基本上,我使用以下代码

@IBAction func createDocumentButtonClicked(_ sender: Any) {
    do {
        // create temporary file
        let tempurl = FileManager.default.temporaryDirectory.appendingPathComponent("fileName.txt")
        try "abc".write(to: tempurl,atomically: true,encoding: .utf8)

        // share file
        let documentInteractionController = UIDocumentInteractionController(url: tempurl)
        documentInteractionController!.name = "filename.txt"
        documentInteractionController!.presentOptionsMenu(from: view.frame,in: view,animated: true)
    } catch {
        // ...
    }
}

运行时,此代码显示共享操作表。日志表明存在一些问题:Could not instantiate class NSURL. Error: Error Domain=NSCocoaErrorDomain Code=4864 "The URL archive of type “public.url” contains invalid data." UserInfo={NSDebugDescription=The URL archive of type “public.url” contains invalid data. 选择任何选项都会导致无法处理文档。

这被简化为几乎教科书级别的代码,但它不起作用。我错过了什么?

更新: 添加了更好地强调问题原因的上下文(请参阅下面我的回答)。

解决方法

结果证明是微不足道的,甚至是愚蠢的。无论如何我都会留下这个问题,以防其他人被它绊倒。

我需要在呈现控制器的按钮操作处理程序之外维护 UIDocumentInteractionController 的实例。我将更新问题以更好地显示此问题。只需稍加改动,它就会按预期工作:

var documentInteractionController: UIDocumentInteractionController?

@IBAction func createDocumentButtonClicked(_ sender: Any) {
    do {
        // create temporary file
        let tempUrl = FileManager.default.temporaryDirectory.appendingPathComponent("fileName.txt")
        try "abc".write(to: tempUrl,atomically: true,encoding: .utf8)

        // share file
        documentInteractionController = UIDocumentInteractionController(url: tempUrl)
        documentInteractionController!.name = "filename.txt"
        documentInteractionController!.presentOptionsMenu(from: view.frame,in: view,animated: true)
    } catch {
        // ...
    }
}