NSCollectionView 不接受按键事件

NSCollectionView won't accept key events

我有一个 window,其中包含 3 个 NSTableView 和 1 个 NSCollectionView。集合视图显示图像。我希望能够 select 其中一张图片并使用键盘删除键将其删除,但我无法让 collectionview 成为第一响应者。我可以 select 任何 tableviews 并覆盖 keyDown 以接受键盘输入,但这不适用于 collectionview。我在别处使用 makeFirstResponder(_:) 强制关注 collectionview,但在该应用程序中 window 只有一个视图。对我做错了什么有什么想法吗?

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

所以尝试启用selection,检查是否启用了集合视图。

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

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

扩展 Kanstantsin 的有效答案...

令人恼火的是,NSCollectionView 不会将未修改的键事件向上传递到响应者链 - 即使它本身不直接处理它们 - 就像 Delete 键。

如果您需要 'Delete' 键作为 'File/Delete' 菜单项的等价键,您只需在界面生成器中通过在 'Key Equivalent' value ,并为 NSCollectionView 创建一个 super-class ,并覆盖 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)
    }
}

这样,菜单最终接收到事件,并执行 'key equivalent' 事情。所以你可以处理它,例如。在视图控制器中:

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