捕获NSTextField中按下的“向上”和“向下”键

时间:2011-07-11 09:30:04

标签: objective-c cocoa nstextfield

我写了一个“代理”Cocoa应用程序,我在状态图标的菜单中有TextField,它看起来像这样:

http://s3.ifotos.pl/img/Zrzut-ekr_hwaqnwa.png

当您使用步进器时,值inc- /减少5.我希望当您有文本字段聚焦并按“向上”或“向下”键时,同样的情况发生 - 值增加或减少5。

我已经发现我必须使用- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector NSControlTextEditingDelegate协议。

但我真的很困惑,我是怎么做到的。通常情况下,我会做sth.delegate = self;而在这里我只是不知道。苹果文档的不友好语言和我糟糕的英语对我没有帮助。我试图寻找答案,但是当我想弄清楚如何使用这种委托方法时,所有人都只是指向control:textView:...并且我的Google搜索功能失败了。

提前感谢很多。请不要打败我;)

3 个答案:

答案 0 :(得分:19)

您需要创建一个对象作为文本字段的委托。这可以在代码中完成,如果合适,也可以在Interface Builder中完成。你可能已经有一个控制器负责这个字段和步进控制,所以这是一个很好的候选者。这个委托对象需要实现你提到的方法:

- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector

只要文本字段的field editor *被要求执行NSResponder action messages之一,就会调用此方法。字段编辑器询问其委托,即文本字段,它应该做什么,并且该字段依次询问其委托,这是您的对象。

commandSelector参数包含操作消息的名称。因此,您可以测试您感兴趣的消息(在这种情况下为moveUp:moveDown:)并拦截它们。您可以执行任何您喜欢的操作,并阻止字段编辑器或文本字段对邮件执行操作。

- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor 
  doCommandBySelector:(SEL)commandSelector {
    if( commandSelector == @selector(moveUp:) ){
        // Your increment code
        return YES;    // We handled this command; don't pass it on
    }
    if( commandSelector == @selector(moveDown:) ){
        // Your decrement code
        return YES;
    }

    return NO;    // Default handling of the command

} 

*简而言之,NSTextView在字段处于活动状态时代表文本字段处理输入。

答案 1 :(得分:2)

尝试覆盖NSResponder消息,如下所示:

- (BOOL)performKeyEquivalent:(NSEvent *)theEvent{
    switch ([[theEvent charactersIgnoringModifiers] characterAtIndex:0]) {
        case NSUpArrowFunctionKey:
            // Increase by 5 here
            return YES;
            break;
        case NSDownArrowFunctionKey:;
            // Decrease by 5 here
            return YES;
            break;
        default:
            break;
    }
    return [super performKeyEquivalent:theEvent];
}

答案 2 :(得分:1)

如果你想捕捉快捷方式,你也可以使用这样的代码:

print(result)
## A tibble: 4 x 3
##  UserID Events transactions
##   <int>  <chr>        <chr>
##1      4   9, 4            2
##2      5      8         4, 3
##3     14      5            3
##4     17     10           NA