我写了一个“代理”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搜索功能失败了。
提前感谢很多。请不要打败我;)
答案 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