我有一个接受键输入的自定义视图,它位于NSScrollView
内。我已将acceptsFirstResponder
设置为yes,并且它正在成功接受keyDown。但每次按下钥匙,我都会听到一声哔哔声。我确信还有其他东西需要但不记得是什么......请帮忙。
-(void)keyUp:(NSEvent *)theEvent{ NSLog(@"is first responder %i", self.window.firstResponder == self); switch (theEvent.keyCode) { case KeyCodeEnumBackspace: case KeyCodeEnumDelete: { if (self.scheduleControl.selectedEvent) { [self.scheduleControl deleteEvent:self.scheduleControl.selectedEvent]; } } break; default: break; } }
答案 0 :(得分:8)
知道了。哔声发生在keyDown
,而不是KeyUp
。要删除蜂鸣声,我需要处理它,一个空的实现就足够了。关键是不将其传递给超级
- (void)keyDown:(NSEvent *)theEvent {
}
- (void)keyUp:(NSEvent *)theEvent {
switch (theEvent.keyCode) {
case KeyCodeEnumBackspace:
case KeyCodeEnumDelete:
if (self.scheduleControl.selectedEvent) {
[self.scheduleControl deleteEvent:self.scheduleControl.selectedEvent];
}
break;
default:
break;
}
}
答案 1 :(得分:0)
这是我的解决方案:
STEP 1.子类化NSViewController并重写-performKeyEquivalent(with:)
方法:
extension MyViewController {
override func performKeyEquivalent(with event: NSEvent) -> Bool {
switch event.modifierFlags.intersection(NSEvent.ModifierFlags.deviceIndependentFlagsMask) {
case [.command] where event.characters == "\r":
// do something, and....
// return a flag that we have handled this key-stroke combination
return true
default:
// otherwise unhandled (by return `false`)
return false
}
}
}
步骤2。设置您的控制器以观察本地事件:
class MyViewController: NSViewController {
// ...
// properties and methods...
// ...
override func viewDidLoad() {
super.viewDidLoad()
_ = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { (event) -> NSEvent? in
// process the event and get the handled/unhandled flag;
let isHandled = self.performKeyEquivalent(with: event)
// stop dispatching this event if handled, or...
// dispatch it forward to next receiver if unhandled
return isHandled ? nil : event
}
}
// ...
}
我发现在您在块中调度事件后,错误蜂鸣是由后续调用之一触发的。因此,要使蜂鸣声静音,只需通过返回nil停止调度它即可。
参考文件:
使用+ addLocal安装事件监视器,该监视器在-[NSApplication sendEvent:]调度事件之前接收事件。在这种情况下,您的块应返回一个有效的NSEvent(可能与传入的NSEvent相同,或者可以是一个新创建的NSEvent)以导致事件被分派,或者它可能返回nil以停止事件的分派。 。请注意,对于嵌套事件跟踪循环(例如控件跟踪,菜单跟踪或窗口拖动)所消耗的事件,不会调用您的处理程序;只有通过-[NSApplication sendEvent:]分派的事件才会传递给您的处理程序。