NSCollectionView不接受关键事件

时间:2017-09-05 12:52:51

标签: keydown first-responder nscollectionview

我有一个包含3个NSTableViews和1个NSCollectionView的窗口。 collectionview显示图像。我希望能够选择其中一个图像并使用键盘删除键将其删除,但我无法将集合视图变为第一响应者。我可以选择任何tableviews并覆盖keyDown以接受键盘输入,但这不适用于collectionview。我在其他地方使用makeFirstResponder(_ :)来强制关注集合视图,但在该应用程序中,窗口只有一个视图。对我做错了什么的想法?

2 个答案:

答案 0 :(得分:3)

如果您可以在集合视图中选择图像或使用键盘上的箭头键在集合视图中导航 - 通常这意味着集合视图是firstResponder。

因此,尝试启用选择,检查是否启用了集合视图。

删除键也可能是等效键 read more here。如果是这样,您应该覆盖performKeyEquivalent(with: )方法以接收此类事件

NSCollectionView keyDown(with: )方法也不会将响应事件链中的关键事件传递给它。要在其超级视图中处理此类事件,您应该在集合视图中通过调用self.nextResponder?.keyDown(with: event)来覆盖您想要自己处理的此类事件。

答案 1 :(得分:1)

要扩展康斯坦丁的有效答案...

令人讨厌的是,NSCollectionView不会将未修改的键事件传递到响应者链上,即使它本身并不能直接处理它们(例如Delete键)。

如果您需要“删除”键作为“文件/删除”菜单项的等效键,则只需在该项目的“等效键”值中按“退格”,即可在界面构建器中对其进行设置,并为NSCollectionView创建一个超类,并覆盖keyDown-在Swift 4中像这样...

    override func keyDown(with event: NSEvent) {
    if let ascii = event.characters?.first?.unicodeScalars.first?.value, ascii == NSBackspaceCharacter || ascii == NSDeleteCharacter {
        nextResponder?.keyDown(with: event)
    } else {
        super.keyDown(with: event)
    }
}

这样,菜单最终将接收事件,并执行“键等效”操作。因此,您可以处理它,例如。在视图控制器中:

@IBAction func delete(_ sender: AnyObject) {
    // ... do whatever
}