Используйте Quick Look в приложении Swift какао для предварительного просмотра аудиофайлов

Мое приложение перечисляет аудиофайлы (MP3) в NSTableView с объектом для каждой строки, содержащим путь к аудиофайлу. Я хотел бы иметь возможность предварительно просмотреть аудиофайл с помощью Quick Look (например, в Finder) при нажатии клавиши пробела, когда выбрана одна строка.

Просматривая связанные вопросы и ответы, я заметил, что API кажется частным, и поэтому было очень сложно найти свежую и надежную информацию или документацию по этому поводу, не говоря уже о Swift. Более того, большинство примеров, которые я нашел, относятся к предварительному просмотру изображений, а в некоторых действительно упоминается «быстрый взгляд на отладку» Xcode, что меня совсем не интересует.

Я видел FTP-клиент, который выполняет быстрый предварительный просмотр любого файла, который Finder может предварительно просмотреть, поэтому я предполагаю, что его можно использовать в своем приложении, особенно если формат файла изначально поддерживается.

Может ли кто-нибудь указать мне правильное направление?


person beeb    schedule 27.09.2015    source источник


Ответы (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")
        }
    }
}

Это состоит из трех частей.

Во-первых, чтобы открыть стандартное окно Quick Look, просто вызовите makeKeyAndOrderFront на общей панели.

Панель знает, что показывать, потому что она обращается к своему источнику данных, который реализован через QLPreviewPanelDataSource. Как вы можете видеть в моем примере, он просто возвращает счетчик 2, и его можно попросить вернуть объект, реализующий QLPreviewItem.

В своей демонстрации я просто возвращаю NSURL экземпляров двум ресурсам, которые включены в систему по умолчанию. Оказывается, NSURL уже реализует протокол QLPreviewItem, поэтому делать больше нечего.

Если элементы, которые вы хотите просмотреть, нелегко преобразовать в URL-адреса (файлы) в файловой системе, вам нужно будет выполнить более сложную реализацию объекта QLPreviewItem.

Бьюсь об заклад, что указание на файлы MP3 будет работать нормально.

person Stefan Arentz    schedule 28.09.2015
comment
Слишком просто, чтобы быть правдой! Большое спасибо, это действительно оказалось очень просто. - person beeb; 28.09.2015
comment
Я заметил в консоли сообщение [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:.. Комментарии выглядят так: @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. Стоит ли мне беспокоиться? - person beeb; 28.09.2015
comment
@beeb, да, это проблема, потому что предоставленный ответ неверен. Вам нужно установить delegate и datasource в beginPreviewPanelControl методе. Посмотрите: stackoverflow.com/a/4528892/4532985 - person Vasily; 20.05.2016
comment
@Vasily Да, через некоторое время я узнал себя, спасибо! - person beeb; 21.05.2016