swift macOS Quick Look Preview Extension未调用-viewDidDisappear

ogsagwnx  于 2023-06-21  发布在  Swift
关注(0)|答案(1)|浏览(131)

我正在macOS上实现一个Quick Look Preview扩展,它将预览一些不支持的音频类型。
为了能够在用户停止预览时停止音频播放,我暂停了-viewDidDisappear中的音频引擎。
然而,问题是-viewDidDisappear只在退出Finder中的Quick Look时被调用,而不是在我用箭头键导航到下一个/上一个文件时。

class PreviewViewController: NSViewController, QLPreviewingController {
    func preparePreviewOfFile(at url: URL, completionHandler handler: @escaping (Error?) -> Void) {
        player.load(url)
        player.play()
    }
    
    override func viewDidDisappear() {
        // Not called when switching to the next or previous preview in Finder!
        player.stop()
    }
}

我已经尝试过NSViewController(-removeFromParent-viewWillDisappear-viewDidDisappear)和NSView(-viewDidHide-viewDidMoveToWindow-viewDidMoveToSuperview)上的所有常见问题,但没有成功。
当我用箭头键在Finder中的快速查看预览中切换到不同的文件时,它们都不会被调用(导致音频在我快速查看其他文件时继续播放)。
有人知道如何知道我的预览视图控制器是否被隐藏了吗?

67up9zun

67up9zun1#

我遇到了同样的问题,找不到任何公共API来通知。
我想出了下面的代码,在文图拉工作。

override func viewDidLoad() {
    super.viewDidLoad()
    
    timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { [weak self] _ in
        self?.timerHandler()
    })
}

@objc func timerHandler() {
    // Hack to find out if we are the top presented window
    if let window = view.window {
        let isActive = window.level.rawValue > 0
        if active {
            player.resume()
        } else {
            player.stop()
        }
    }
}

这可能无法通过应用商店的审查,但你总是可以模糊它一点点。多年来,我看到许多公司发布了类似的修复程序。只要它是无害的,它应该是好的。

相关问题