Cocoa:对 QLPreviewPanel 中的 keyDown 做出反应

Cocoa: react to keyDown in QLPreviewPanel

我在 Swift 2 中通过以下方式在我的项目中实现了快速查看(我将其包含在此处以供参考,因为它可能会帮助其他人进行设置)。

我的 NSViewController 包含一个 NSTableView 子类,我在其中实现 keyDown 以监听按下的空格键(可能不是最好的方法,但它有效):

override func keyDown(theEvent: NSEvent) {
    let s   =   theEvent.charactersIgnoringModifiers!
    let s1  =   s.unicodeScalars
    let s2  =   s1[s1.startIndex].value
    let s3  =   Int(s2)
    if s3 == Int(" ".utf16.first!) {
        NSNotificationCenter.defaultCenter().postNotification(NSNotification(name: "MyTableViewSpacebar", object: nil))
        return
    }
    super.keyDown(theEvent)
}

在我的视图控制器中,我有一个用于此通知的观察者以及 QLPreviewPanel:

所需的功能
//...
class ViewController: NSViewController {

    @IBOutlet weak var myTableView: MyTableView!
    var files = [FilesListData]() //array of custom class
    //...

    override func viewDidLoad() {
        //...

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "spaceBarKeyDown:", name: "MyTableViewSpacebar", object: nil)
    }

    func spaceBarKeyDown(notification: NSNotification) {
        if let panel = QLPreviewPanel.sharedPreviewPanel() {
            panel.makeKeyAndOrderFront(self)
        }
    }

    override func acceptsPreviewPanelControl(panel: QLPreviewPanel!) -> Bool {
        return true
    }

    override func beginPreviewPanelControl(panel: QLPreviewPanel!) {
        panel.delegate = self
        panel.dataSource = self
    }

    override func endPreviewPanelControl(panel: QLPreviewPanel!) {
    }

}

extension ViewController: QLPreviewPanelDataSource {
    func numberOfPreviewItemsInPreviewPanel(panel: QLPreviewPanel!) -> Int {
        return self.myTableView.selectedRowIndexes.count
    }

    func previewPanel(panel: QLPreviewPanel!, previewItemAtIndex index: Int) -> QLPreviewItem! {
        if self.myTableView.selectedRow != -1 {
            var items = [QLPreviewItem]()

            let manager = NSFileManager.defaultManager()
            for i in self.myTableView.selectedRowIndexes {
                let path = self.files[i].path //path to a MP3 file
                if manager.fileExistsAtPath(path) {
                    items.append(NSURL(fileURLWithPath: path))
                } else {
                    items.append(qm_url) //image of a question mark used as placeholder
                }
            }

            return items[index]
        } else {
            return qm_url //image of a question mark used as placeholder
        }
    }
}

我现在想做的 是在快速查看面板打开时按顺序听 "up arrow" 和 "down arrow" 键被按下的声音更改 NSTableView 中的选定行,很像 Finder 在使用快速查看预览文件时的行为。我不知道如何实现它。有什么想法吗?

谢谢。

终于找到了我要找的东西,其实很简单。

因为我的主视图控制器也是我的 QLPreviewPanel 委托,所以我添加了这个:

extension ViewController: QLPreviewPanelDelegate {
    func previewPanel(panel: QLPreviewPanel!, handleEvent event: NSEvent!) -> Bool {
        let kc = event.keyCode
        if (kc == 126 || kc == 125) { //up and down arrows
            if event.type == NSEventType.KeyDown {
                self.myTableView.keyDown(event) //send the event to the table
            } else if event.type == NSEventType.KeyUp {
                self.myTableView.keyUp(event)
            }
            return true
        }
        return false
    }
}

然后在我的 table 视图委托中:

func tableViewSelectionDidChange(notification: NSNotification) {
    guard myTableView.numberOfSelectedRows > 0 else {
        if let panel = QLPreviewPanel.sharedPreviewPanel() {
            if panel.visible {
                panel.close()
            }
        }
        return
    }

    if let panel = QLPreviewPanel.sharedPreviewPanel() {
        if panel.visible {
            panel.reloadData()
        }
    }
}

就是这样! QLPreviewPanelDataSource 处理其余部分。