将热键添加到 NSTextField
Posted
技术标签:
【中文标题】将热键添加到 NSTextField【英文标题】:Add HotKey to NSTextField 【发布时间】:2012-07-25 20:16:37 【问题描述】:我的NSTextField
子类有些问题。这是一个用于输入一些消息的文本字段。当我的子文本字段是第一响应者并且用户按下热键 Cmd + Enter 时,我的应用程序必须发送此消息。我不能使用 Carbon 方法RegisterEventHotKey()
,因为许多应用程序使用此热键执行相同的操作,但我的应用程序拦截了它。我能做什么?
【问题讨论】:
【参考方案1】:在文本字段委托中,您可以按照所有“标准”命令发送到控件。然后,一旦遇到命令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
【讨论】:
很高兴你成功了!尽管就类设计而言,我的解决方案更加解耦。如果您正在开发一个相当大的应用程序,请确保您确实想要继承 NSApplication 并微观管理该特定事件。祝你好运:) 这对我有用,除了使用委托- (BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
而不是 - (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
。谢谢!【参考方案2】:
我继承了 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 类。有效!
【讨论】:
以上是关于将热键添加到 NSTextField的主要内容,如果未能解决你的问题,请参考以下文章