如何检测“快速查看”面板何时关闭?

时间:2018-09-16 10:58:00

标签: objective-c xcode macos cocoa quicklook

我编写了一个Quick Look插件,尝试播放这样的音乐:

OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options)
{
    NSURL *fileURL = (__bridge NSURL*)url;

    AudioPlayer *player = // load player with fileURL

    // Create a semaphore
    sema = dispatch_semaphore_create(0);
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);

    // Start playback and signal the semaphore once finished
    [player play:^{
        dispatch_semaphore_signal(sema);
    }];

    // Wait here until the player completion block signals the semaphore to stop waiting
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    NSLog(@"%@", @"done!");

    return kQLReturnNoError;
}

由于各种原因,将这些音频文件转码为macOS可以识别的格式对我来说是不切实际的,否则我可以将OS的MP3文件交给操作系统并为我播放该文件。因此,我改为使用带有信号灯的肮脏的程序来停止执行,以使播放器对象保持在原处,否则,它将在开始播放后立即停止。

问题在于,由于“快速查找”进程仍在运行,因此“快速查找”面板停止预览后,该文件将仅继续播放。

有没有办法像解散系统插件一样停止播放?

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用以下委托方法:

根据Apple文档:

  

func PreviewControllerWillDismiss(QLPreviewController)   在关闭预览控制器之前调用。   func PreviewControllerDidDismiss(QLPreviewController)   关闭预览控制器后调用。