NSTokenField捕获一些NSEvents

时间:2014-05-27 19:01:19

标签: objective-c cocoa private nstokenfield

我需要为NSTokenField执行Command + Enter,Command + O和Esc镜头切换以及像https://stackoverflow.com/a/18486965/1067147这样的解决方案不起作用,因为 - (void)noop:(SEL)sel不是很有用。

1 个答案:

答案 0 :(得分:0)

我的方法是为层次结构类NSView创建类别(我也尝试NSTextView但没有运气):

//  NSView+WideInterpreter.h

#import <Cocoa/Cocoa.h>

#define kNotificationTokenModifier          @"kNotificationTokenModifier"
#define kNotificationTokenModifier_modifier @"kNotificationTokenModifier_modifier"

typedef enum{

    BMTokenModifier_CommandEnter = 10,
    BMTokenModifier_CommandO,
    BMTokenModifier_Esc,
    BMTokenModifier_nextKeyViewActivate

} BMTokenModifier;

@interface NSView (WideInterpreter)

@end

NSView+WideInterpreter.m
#import "NSView+WideInterpreter.h"

@implementation NSView (WideInterpreter)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"

- (void)interpretKeyEvents:(id)keyEvents{

    NSMutableArray *result = [[NSMutableArray alloc] init];

    for (NSEvent *theEvent in keyEvents) {

        NSUInteger clearFlags = ([theEvent modifierFlags] &     NSDeviceIndependentModifierFlagsMask);
        BOOL commandPressed = (clearFlags == NSCommandKeyMask);

        switch ([theEvent keyCode]) {
            case 31:{//Ctrl+O
                if (commandPressed)
                    [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationTokenModifier
                                                                        object:self
                                                                          userInfo:@{kNotificationTokenModifier_modifier: @(BMTokenModifier_CommandO)}];
            }break;

            case 36:{//Enter
                if (commandPressed)
                    [[NSNotificationCenter defaultCenter]     postNotificationName:kNotificationTokenModifier
                                                                        object:self
                                                                          userInfo:@{kNotificationTokenModifier_modifier: @(BMTokenModifier_CommandEnter)}];
                else
                    [super insertNewlineIgnoringFieldEditor:self];
            }break;

            case 53://Esc
                [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationTokenModifier
                                                                    object:self
                                                                  userInfo:@{kNotificationTokenModifier_modifier: @(BMTokenModifier_Esc)}];
                break;

            default:// allow super to handle everything else
                [result addObject:theEvent];
                break;
        }
    }

    [super interpretKeyEvents:result];

}

#pragma clang diagnostic pop

@end

对于使用的作品:

[[NSNotificationCenter defaultCenter] addObserverForName:kNotificationTokenModifier
                                                  object:nil
                                                   queue:[NSOperationQueue currentQueue]
                                              usingBlock:^(NSNotification *note) {

                                                  BMTokenModifier modifier = (BMTokenModifier)[[[note userInfo] objectForKey:kNotificationTokenModifier_modifier] integerValue];

                                                  switch (modifier) {
                                                      case BMTokenModifier_CommandEnter:
                                                          [self sendMessage];
                                                          break;

                                                      case BMTokenModifier_CommandO:
                                                          [self attachFiles];
                                                          break;

                                                      default:
                                                          break;
                                                  }
                                              }];
相关问题