【问题标题】:Unable to preview files with QuickLook无法使用 QuickLook 预览文件
【发布时间】:2021-10-24 17:47:46
【问题描述】:

我正在使用这个简单的工具来预览我的应用程序中的不同文件,但没有一个文件被成功预览。

我第一次尝试预览任何文件时,它会打开带有消息Unsupported file format 的预览控制器,而其他任何时候它只显示文件名和单词data(见图)。

这是实现(注意打印语句):

extension FileShareVC: QLPreviewControllerDataSource, QLPreviewControllerDelegate {
    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        filesList.count
    }
    
    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        
        let url = NSURL(fileURLWithPath: filesList[index].filePath ?? "", isDirectory: false)
        print(filesList[index].filePath!)
        //prints file:///var/mobile/Containers/Data/Application/AB608864-C682-47BB-8396-2D456430879E/Documents/F9RIB62HBUAW.jpeg
        print("url: \(url)")
        //prints file:/var/mobile/Containers/Data/Application/AB608864-C682-47BB-8396-2D456430879E/Documents/F9RIB62HBUAW.jpeg -- file:///
        return url
    }
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
                  
        let quickLookViewController = QLPreviewController()
        quickLookViewController.dataSource = self
        quickLookViewController.delegate = self
        quickLookViewController.currentPreviewItemIndex = indexPath.row
        present(quickLookViewController, animated: true)
    }

我不确定为什么我的网址会在文件路径上附加 -- file:///,这可能是导致问题的原因吗?

【问题讨论】:

  • 因为 filesList 是具有属性 filepath 的 File 类的数组
  • 在下面查看我的帖子
  • 另请注意,您的应用已被沙盒化,并且每次启动时其位置都会发生变化。如果您需要保留该信息,则应仅保存其名称和目录,并在需要时重构您的 URL。
  • 嗯,这是关于沙盒的非常好的信息,但我该如何改变呢?我现在将我的文件存储在 .libraryDirectory 中,然后将它们发送到 API。 API 会返回包含不再有效的文件路径的 filesList,对吗?解决办法是什么?
  • 这取决于您是否有子文件夹。如果你不只是保存 lastPathComponent

标签: swift quicklook qlpreviewcontroller files-app


【解决方案1】:

问题是您使用了错误的初始化程序。您正在将 absoluteString 传递给需要路径的初始化程序(您的字符串包含方案 file://)。顺便说一句,将 filePath 称为 absoluteString 具有误导性。

guard let url = URL(string: filesList[index].filePath ?? "") else {
    return // an alternate URL or a just create a fatalError
}

另请注意,您的应用已被沙盒化,其位置会在每次启动时发生变化。如果您需要保留该信息,则应仅保存其名称和目录,并在需要时重构您的 URL。


编辑更新:

请注意,您不应该将文件直接放在库文件夹中。 file system basics

【讨论】:

  • 感谢里奥。我尝试了您提供的这个版本的 url,但结果仍然相同。也许问题出在您正在谈论的沙箱中。 ,但我该如何改变呢?我现在将我的文件存储在 .libraryDirectory 中,然后将它们发送到 API。 API 会返回包含不再有效的文件路径的 filesList,对吗?解决办法是什么?
  • 最好的选择是在应用启动时获取目录的内容
  • 所以如果我理解你的话,我应该只将 name.extension 发送给 API,因为我没有子文件夹。然后在尝试使用 API 返回给我的 name.extension 预览文件后,我应该尝试在目录中找到该文件(其路径),因为这部分“AB608864-C682-47BB-8396-2D456430879E”在每个应用程序上都在更改跑步吗?
  • 但是我会将答案标记为正确,因为它解决了“file://”问题
  • 这是正确的,但请检查文件系统基础链接。您应该使用应用程序支持文件夹。只需使用您的捆绑包 ID 在那里创建一个子文件夹并将您的文件放在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
相关资源
最近更新 更多