【问题标题】:Add HotKey to NSTextField将热键添加到 NSTextField
【发布时间】:2012-07-25 20:16:37
【问题描述】:

我的NSTextField 子类有些问题。这是一个用于输入一些消息的文本字段。当我的子文本字段是第一响应者并且用户按下热键 Cmd + Enter 时,我的应用程序必须发送此消息。我不能使用 Carbon 方法RegisterEventHotKey(),因为许多应用程序使用此热键执行相同的操作,但我的应用程序拦截了它。我能做什么?

【问题讨论】:

    标签: cocoa hotkeys


    【解决方案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 类。有效!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多