Cocoa:对QLPreviewPanel中的keyDown做出反应

时间:2015-11-19 16:10:38

标签: cocoa nstableview keydown quicklook

我在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
        }
    }
}

现在我想做什么是在快速查看面板打开时按下“向上箭头”和“向下箭头”键,以便更改所选行NSTableView,就像 Finder 一样,在您快速查看文件时会表现出来。我不知道如何实现这一点。有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:3)

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

由于我的主视图控制器也是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
    }
}

然后在我的表视图委托:

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处理其余部分。