Objective c 捕捉;“向上”;及;“向下”;在NSTextField中按的键

Objective c 捕捉;“向上”;及;“向下”;在NSTextField中按的键,objective-c,cocoa,nstextfield,Objective C,Cocoa,Nstextfield,我写了一个“代理”可可应用程序,其中一个文本字段位于状态图标的菜单中。图标菜单显示如下: (来源:) 步进器将该值增加或减少5。文本字段的用途是按下“向上”或“向下”键,从而获得相同的值递增或递减5的结果 我发现以下代码必须使用-(BOOL)控件:(NSControl*)控件文本视图:(NSTextView*)字段编辑器doCommandBySelector:(SEL)命令选择器,属于NSControlTextEditingDelegate协议 我目前遇到的问题是如何实现代码。我通常的做法是使

我写了一个“代理”可可应用程序,其中一个文本字段位于状态图标的菜单中。图标菜单显示如下:


(来源:)

步进器将该值增加或减少5。文本字段的用途是按下“向上”或“向下”键,从而获得相同的值递增或递减5的结果

我发现以下代码必须使用
-(BOOL)控件:(NSControl*)控件文本视图:(NSTextView*)字段编辑器doCommandBySelector:(SEL)命令选择器
,属于
NSControlTextEditingDelegate
协议

我目前遇到的问题是如何实现代码。我通常的做法是使用
sth.delegate=self。我试图搜索答案,但答复包括使用to
控件:textView:…
。即使经过进一步研究,我也无法学会如何使用委托方法


提前谢谢你

尝试如下方式覆盖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];
}
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {

NSEvent *currentEvent = [[NSApplication sharedApplication]currentEvent];
if ((currentEvent.modifierFlags & NSCommandKeyMask) && (currentEvent.keyCode == kVK_Return)) {  //command + enter to confirm
    //do what you want
    return YES;
}
return NO;
}

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

- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
每当要求文本字段的*执行以下操作之一时,将调用此方法。字段编辑器询问它的委托,即文本字段,它应该做什么,字段反过来询问它的委托,即您的对象

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
,当文本字段处于活动状态时,它代表文本字段处理输入。

如果要捕获快捷方式,也可以使用如下代码:

- (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];
}
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {

NSEvent *currentEvent = [[NSApplication sharedApplication]currentEvent];
if ((currentEvent.modifierFlags & NSCommandKeyMask) && (currentEvent.keyCode == kVK_Return)) {  //command + enter to confirm
    //do what you want
    return YES;
}
return NO;
}

Radex,希望这比文档更容易理解;如果你需要澄清,请告诉我。是的,是的,是的!非常感谢。这比文件更容易理解。苹果的文档非常混乱,我甚至没有想到它是如此明显:)关于这个方法,我发现了一件奇怪的事情:performKeyEquivalent并不局限于响应者链。任何实现此功能的视图都可以被调用,不管它是否具有焦点,如果它返回YES,则可以阻止当前第一响应者接收关键事件。如果使用此选项捕捉NSTextField子类中的箭头键按下,请首先检查它是否为当前第一响应者:如果([[self window]firstResponder]!=self)返回[super performKeyEquivalent:event];