【问题标题】:Use Quick Look inside a Swift cocoa application to preview audio files在 Swift 可可应用程序中使用 Quick Look 来预览音频文件
【发布时间】:2015-12-24 23:24:43
【问题描述】:

我的应用程序在 NSTableView 中列出音频文件 (MP3),每行的对象都包含音频文件的路径。我希望能够在选中一行的情况下点击空格键时使用 Quick Look(如在 Finder 中)预览音频文件。

通过查看相关问题和答案,我注意到 API 似乎是私有的,因此很难找到关于此的最新且可靠的信息或文档,更不用说在 Swift 中了。更何况,我发现的大多数例子都与图像预览有关,有些实际上是在提到 Xcode 的“debug quick look”,这根本不是我感兴趣的。

我见过一个 FTP 客户端,它对 Finder 可以预览的任何文件进行快速查看预览,所以我猜它可以在一个应用程序中使用它,特别是如果文件格式是本机支持的。

有人能指出正确的方向吗?

【问题讨论】:

    标签: swift cocoa mp3 quicklook


    【解决方案1】:

    这实际上非常简单。所有 API 都是公开的。我确实认为 OS X 10.10 让事情变得更简单了,只是文档记录不够完善?

    这是一个 ViewController 的示例,它有一个按钮来触发标准的快速查看面板,其中包含两个可以在文件系统上找到的项目。

    class ViewController: NSViewController {
        @IBAction func showQuickLookPanel(sender: AnyObject) {
            if let panel = QLPreviewPanel.sharedPreviewPanel() {
                panel.dataSource = self
                panel.makeKeyAndOrderFront(self)
            }
        }
    }
    
    extension ViewController: QLPreviewPanelDataSource {
        func numberOfPreviewItemsInPreviewPanel(panel: QLPreviewPanel!) -> Int {
            return 2
        }
    
        func previewPanel(panel: QLPreviewPanel!, previewItemAtIndex index: Int) -> QLPreviewItem! {
            if index == 0 {
                return NSURL(fileURLWithPath: "/Library/Desktop Pictures/Beach.jpg")
            } else {
                return NSURL(fileURLWithPath: "/System/Library/Compositions/Rollercoaster.mov")
            }
        }
    }
    

    这分为三个部分。

    首先,要打开标准的快速查看窗口,只需在共享面板上调用makeKeyAndOrderFront

    面板知道要显示什么,因为它与它的数据源对话,它是通过QLPreviewPanelDataSource 实现的。正如您在我的示例中看到的那样,它只返回2 的计数,并且可以要求它返回实现QLPreviewItem 的对象。

    对于我的演示,我只是将NSURL 实例返回到默认包含在系统中的两个资源。原来NSURL 已经实现了QLPreviewItem 协议,所以没有什么额外的事情要做。

    如果您要预览的项目不容易转换为文件系统上的 URL(文件),那么您将需要对 QLPreviewItem 对象进行更复杂的实现。

    我敢打赌,指向 MP3 文件会正常工作。

    【讨论】:

    • 简直太简单了!非常感谢,事实证明这确实非常简单。
    • 我注意到控制台中有一条消息,内容为[QL] QLError(): -[QLPreviewPanel setDataSource:] called while the panel has no controller - Fix this or this will raise soon. See comments in QLPreviewPanel.h for -acceptsPreviewPanelControl:/-beginPreviewPanelControl:/-endPreviewPanelControl:.。 cmets 长这样:@abstract Sent to each object in the responder chain to find a controller.; @param panel The Preview Panel looking for a controller.; @result YES if the receiver accepts to control the panel. You should never call this method directly. 我应该担心吗?
    • @beeb,是的,这是问题,因为提供的答案不正确。您需要在beginPreviewPanelControl 方法中设置delegatedatasource。看:stackoverflow.com/a/4528892/4532985
    • @Vasily 是的,过了一会儿我发现了自己,谢谢!
    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2023-03-04
    • 2011-12-27
    • 2010-11-01
    相关资源
    最近更新 更多