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
}
我有一个 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
}