击中钥匙时发出不必要的哔声

时间:2012-08-17 17:51:55

标签: cocoa nsview nsresponder

我有一个接受键输入的自定义视图,它位于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;
}
   }

2 个答案:

答案 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:]分派的事件才会传递给您的处理程序。