Отсутствующие события keyUp для значимых комбинаций клавиш (например, «Выбрать до начала строки») - PullRequest
4 голосов
/ 23 октября 2010

У меня есть NSTextField, который использует в качестве расширенного NSTextFieldCell, который создает пользовательский редактор полей, который перехватывает и записывает ключевые события.(Знание ключевых событий важно для приложения, но текстовое поле все еще должно работать как обычно, вызывая метод [super ...]).Это то, что предлагает официальная документация для этой проблемы.

Я получаю большинство keyUp событий при наборе, но в некоторых случаях я не получаю ни одного.Кажется, это происходит при нажатии комбинации клавиш, к которой прикреплено действие.Например, Cmd-Shift-Left не генерирует событие keyUp.Этот ввод делает выделенной целую строку от точки до начала, но уже при получении keyDown.

В тех случаях, когда она отсутствует, при просмотре -performKeyEquivalent: путем ее переопределения я вижуэто называется.Почему ключ не доставлен?

Ответы [ 3 ]

10 голосов
/ 08 марта 2013

Для других это код, чтобы «исправить» это:

- (void)sendEvent:(NSEvent *)event {
    if ([event type] == NSKeyUp && ([event modifierFlags] & NSCommandKeyMask))
        [[self keyWindow] sendEvent:event];
    else
        [super sendEvent:event];
}
7 голосов
/ 23 октября 2010

Это просто способ настройки архитектуры событий. Отправка сообщений, эквивалентных ключам, предпочтительнее, чем отправка сообщений для различных ключей, которые являются их частью. См. «Обработка ключевых событий», в частности , «Обработка ключевых эквивалентов». Похоже, что вы можете создать подкласс NSApplication и переопределить -sendEvent:, чтобы отправлять эти события так, как вам хочется, но вы, скорее всего, нарушите больше функций, чем добавили бы.

1 голос
/ 31 октября 2014

Чтобы сохранить нормальное поведение приложения и добавить свое собственное (сводя к минимуму вероятность непредвиденных побочных эффектов), возможны уведомления:

- (void)sendEvent:(NSEvent *)theEvent
{
    [super sendEvent:theEvent];
    if (theEvent.modifierFlags & NSCommandKeyMask) {
        if (theEvent.type == NSKeyUp) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"myKeyUp" object:theEvent];
        }
        if (theEvent.type == NSKeyDown) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"myKeyDown" object:theEvent];
        }
    }
}

Затем добавьте соответствующий объект (ы) в качестве наблюдателя (ей) для уведомлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...