Нежелательный гудок при нажатии клавиши

У меня есть пользовательский вид, который принимает ввод с клавиатуры, его внутри NSScrollView, Я установил acceptsFirstResponder Да, и он успешно принимает 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;
}
   }

1 ответ

Решение

Понял. Звуковой сигнал происходит в 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. Подкласс 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:].

Другие вопросы по тегам