Лучшее место для перехвата Cmd-Key в приложении на основе NSDocument

Что было бы наиболее подходящим местом для перехвата ключевых событий CmdAnyKey в NSDocument на основе приложения?

Намерение состоит в том, чтобы переключиться на какой-либо компонент в активном окне - например, Firefox позволяет переключать вкладки - без соответствующей комбинации клавиш в меню для выполнения этой задачи.

Т.е. в идеале фреймворк должен выполнять свою обычную обработку, включая обработку команд меню, и после того, как все другие респонденты не отвечают на этот конкретный ярлык, он должен быть перенаправлен в пользовательский метод.

Я искал NSDocument, NSAppDelegate, NSWindowController но не смог найти подходящий механизм для получения этих команд на уровне окна.

Таким образом, отсутствие какого-либо существующего механизма настройки переопределяет keyDown: в обычае NSWindowController Как выглядит наиболее подходящий способ для достижения желаемого эффекта?

1 ответ

Решение

Да, подклассы NSWindow - это способ сделать это, если вам нужно получить событие клавиатуры после того, как все цепочки респондента отказались его обрабатывать.

Вот как я это сделал в одном из моих проектов:

- (void)keyDown:(NSEvent*)event
{
    SEL keyDownBool = @selector(keyDownBool:);

    if ([[self delegate] respondsToSelector:keyDownBool]
    && [[self delegate] performSelector:keyDownBool withObject:event])
    {
        return;
    }

    [super keyDown:event];
}

Мой обычай keyDownBool: Метод делегата возвратил YES, если он обработал определенное ключевое событие. В противном случае этот метод передает ключевое событие до super,

Сейчас я пользуюсь + (id)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent* (^)(NSEvent*))block вместо подклассов. Разница в том, что он обрабатывает (и, возможно, отбрасывает) события до их отправки.

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