使用 UIDocumentInteractionController 共享文档
Sharing a Document with 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 {
// ...
}
}
当运行时,此代码呈现分享动作sheet。日志表明存在一些问题: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 {
// ...
}
}
我正在尝试使用 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 {
// ...
}
}
当运行时,此代码呈现分享动作sheet。日志表明存在一些问题: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 {
// ...
}
}