从 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 以编程方式打开文档的主要内容,如果未能解决你的问题,请参考以下文章

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism?

mysql 主-主-从-从