У меня проблемы с моим подклассом NSTextField
. Это текстовое поле для ввода сообщения. И мое приложение должно отправить это сообщение, когда мое подтекстовое поле является первым ответчиком, и пользователь нажимает горячую клавишу Cmd + Enter. Я не могу использовать метод Carbon RegisterEventHotKey()
, потому что многие приложения используют эту горячую клавишу для одного и того же действия, но мое приложение ее перехватывает. Что я могу сделать?
Добавить горячую клавишу в NSTextField
Ответы (2)
В текстовом поле делегата вы можете следить за всеми «стандартными» командами, отправляемыми в управление. Затем, как только вы встретите команду noon:
, проверьте текущую комбинацию клавиш. Если это Command-Enter
, делайте свое дело. Что-то вроде этого должно работать:
@interface VCEAppDelegate : NSObject <NSApplicationDelegate, NSTextFieldDelegate>
@property (nonatomic, weak) IBOutlet NSTextField *textField;
@end
// .m
@implementation VCEAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
self.textField.delegate = self;
}
- (BOOL)isCommandEnterEvent:(NSEvent *)e {
NSUInteger flags = (e.modifierFlags & NSDeviceIndependentModifierFlagsMask);
BOOL isCommand = (flags & NSCommandKeyMask) == NSCommandKeyMask;
BOOL isEnter = (e.keyCode == 0x24); // VK_RETURN
return (isCommand && isEnter);
}
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView
doCommandBySelector:(SEL)commandSelector {
if ((commandSelector == @selector(noop:)) &&
[self isCommandEnterEvent:[NSApp currentEvent]]) {
[self handleCommandEnter];
return YES;
}
return NO;
}
- (void)handleCommandEnter {
NSLog(@"Do something on Command-Enter");
}
@end
person
Vadim
schedule
27.07.2012
Рад, что у вас получилось! Хотя с точки зрения дизайна класса мое решение более развязано. Если вы работаете над сравнительно большим приложением, убедитесь, что вы действительно хотите создать подкласс NSApplication и микроуправлять этим конкретным событием. Удачи :)
- person Vadim; 27.07.2012
Это сработало для меня, за исключением использования делегата
- (BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
вместо - (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
. Спасибо!
- person duncanwilcox; 20.01.2014
Я создал подкласс NSApplication и метод переопределения
- (void) sendEvent:(NSEvent*) event {
if ([event type] == NSKeyDown) {
if (([event modifierFlags] & NSDeviceIndependentModifierFlagsMask) == NSCommandKeyMask) {
if ([event keyCode] == 36) {
if ([self.delegate respondsToSelector:@selector(sendMessage:)]) {
[self.delegate performSelector:@selector(sendMessage:) withObject:nil];
}
}
}
}
[super sendEvent:event];
}
в info.plist я написал, что этот класс sub-NSApplication является классом Principal. Оно работает!
person
mischa
schedule
27.07.2012