Лучшее место для перехвата 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
вместо подклассов. Разница в том, что он обрабатывает (и, возможно, отбрасывает) события до их отправки.