【发布时间】:2012-07-25 20:16:37
【问题描述】:
我的NSTextField 子类有些问题。这是一个用于输入一些消息的文本字段。当我的子文本字段是第一响应者并且用户按下热键 Cmd + Enter 时,我的应用程序必须发送此消息。我不能使用 Carbon 方法RegisterEventHotKey(),因为许多应用程序使用此热键执行相同的操作,但我的应用程序拦截了它。我能做什么?
【问题讨论】:
我的NSTextField 子类有些问题。这是一个用于输入一些消息的文本字段。当我的子文本字段是第一响应者并且用户按下热键 Cmd + Enter 时,我的应用程序必须发送此消息。我不能使用 Carbon 方法RegisterEventHotKey(),因为许多应用程序使用此热键执行相同的操作,但我的应用程序拦截了它。我能做什么?
【问题讨论】:
在文本字段委托中,您可以按照所有“标准”命令发送到控件。然后,一旦遇到命令noop:,测试当前的组合键。如果是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
【讨论】:
- (BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector 而不是 - (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector。谢谢!
我继承了 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 中我写道,这个子 NSApplication 类是一个 Principal 类。有效!
【讨论】: