【问题标题】:Can't get QuickLook to work when trying to preview files尝试预览文件时无法使用 QuickLook
【发布时间】:2019-08-31 16:30:34
【问题描述】:

我正在使用故事板使用 Swift 编写 macOS 应用程序。我有一个 NSTableView,其中包含我希望用户能够通过 QuickLook 预览的文件。

我似乎一切就绪,我的代码看起来与这里描述的非常相似:QuickLook consumer as a delegate from an NSViewController,但我不断收到错误

-[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:.

我一直在尝试使上述帖子的解决方案适应我使用 Swift 和故事板的情况。

主要部分有:

import Quartz

class ViewController: NSViewController, QLPreviewPanelDataSource, QLPreviewPanelDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        let windowNextResponder = self.view.window?.nextResponder
        self.view.window?.nextResponder = self
        self.nextResponder = windowNextResponder
    }

    // *** Quicklook stuff ***

    @IBAction func quickLookButtonAction(_ sender: Any) {
        guard qlPanel != nil else {
            return
        }

        if qlPanel!.currentController == nil {
            print ("No controller")
            //qlPanel!.windowController = self.view.window?.windowController
            // qlPanel!.updateController()
        } else {
            print (qlPanel!.currentController)
        }
        qlPanel!.delegate = self
        qlPanel!.dataSource = self

        qlPanel!.makeKeyAndOrderFront(self)
    }

    func numberOfPreviewItems(in panel: QLPreviewPanel!) -> Int {
        return CSVarrayController.selectedObjects.count
    }

    func previewPanel(_ panel: QLPreviewPanel!, previewItemAt index: Int) -> QLPreviewItem! {
        let file = CSVarrayController.selectedObjects[index] as! CSVfile
        return file.url as NSURL
    }
    override func acceptsPreviewPanelControl(_ panel: QLPreviewPanel!) -> Bool {
        return true
    }
    override func beginPreviewPanelControl(_ panel: QLPreviewPanel!) {
        panel.dataSource = self
        panel.delegate = self
    }

    override func endPreviewPanelControl(_ panel: QLPreviewPanel!) {
        panel.dataSource = nil
        panel.delegate = nil
    }
} 

不管有没有弄乱响应者链,我都会收到错误消息。 委托函数也都按预期调用。

【问题讨论】:

    标签: swift macos cocoa quartz quicklook


    【解决方案1】:

    删除

    qlPanel!.delegate = self
    qlPanel!.dataSource = self
    

    quickLookButtonAction 中,视图控制器尚未控制。等待beginPreviewPanelControl

    来自currentController 的文档:

    如果您不控制预览面板的状态(其委托、数据源等),则永远不要更改它。

    来自-beginPreviewPanelControl: 的 QLPreviewPanel.h 中的 cmets:

    发送到控制预览面板的对象。

    接收方应在此处设置预览面板(数据源、委托、绑定等)。

    【讨论】:

    • 试过了。它正在接受控制、开始控制、提供计数(多次)以及提供要显示的文件,并且空面板显示为“微调器”。不幸的是,在没有任何信息的情况下崩溃之前,6-7 秒内什么也没有发生。
    • 也就是说,原来的错误信息已经没有出现了,所以我猜这是进步.... :)
    • 我试过你的代码,它对我有用。 Finder 中的快速查看是否有效?
    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多