从 UIDocumentBrowserViewController 中的 UserDefaults 以编程方式打开文档
Posted
技术标签:
【中文标题】从 UIDocumentBrowserViewController 中的 UserDefaults 以编程方式打开文档【英文标题】:open document programmatically from UserDefaults in UIDocumentBrowserViewController 【发布时间】:2019-08-10 03:01:00 【问题描述】:我正在使用UIDocumentBrowserViewController
快速开发基于文档的应用程序。我希望应用程序默认打开上次会话中使用的上一个文件。退出应用程序时,我将文件 URL 保存在 UserDefaults 中。当我重新启动应用程序时,UIDocumentBrowserViewController
会显示它的视图。我想在viewDidLoad()
中添加一个if 语句,用于检查fileURL
是否存在于UserDefaults
中。如果是,我想选择那个文件,打开它并展示它。最简单的方法似乎是弄清楚如何从现有的presentDocument(at: documentURL)
方法中使用UIDocumentBrowserViewController
,或者可能是从 UIDocumentBrowserViewControllerDelegate 方法之一;换句话说,我想以编程方式在UIDocumentBrowserViewController
中选择一个文件并呈现它。但是,当我尝试此操作时,文档无法在 UIDocument
方法 open(completionHandler: )
中打开(即完成处理程序报告失败)。我确定我有正确的 fileURL,我尝试使用的文件也在云目录中关于如何实现它的任何想法?
【问题讨论】:
【参考方案1】:我发现您必须使用书签而不是 URL。创建书签并保存到UserDefaults
的代码如下:
do
let bookmark = try (document.fileURL as NSURL).bookmarkData(options: .suitableForBookmarkFile, includingResourceValuesForKeys: nil, relativeTo: nil)
UserDefaults.standard.set(bookmark, forKey: "bookmark")
catch let error as NSError
print("Set Bookmark Fails: \(error.description)"
检索书签、将其转换为 URL 并呈现文档的代码如下:
if let bookmarkData = (UserDefaults.standard.object(forKey: "bookmark") as? NSData)
do
let url = try NSURL.init(resolvingBookmarkData: bookmarkData as Data, options: .withoutUI, relativeTo: nil, bookmarkDataIsStale: nil)
url.startAccessingSecurityScopedResource()
presentDocument(at: url as URL)
catch let error as NSError
print("Bookmark Access Fails: \(error.description)")
【讨论】:
以上是关于从 UIDocumentBrowserViewController 中的 UserDefaults 以编程方式打开文档的主要内容,如果未能解决你的问题,请参考以下文章