在NSTextfield中覆盖keydownevent

时间:2011-05-06 17:28:16

标签: objective-c cocoa nstextfield

我创建了nstextfield的子类,并且我覆盖了keydown事件但是我的代码不起作用,然后我覆盖de keyup事件并且代码完美地工作。 我的keydown代码(不起作用):

-(void)keyDown:(NSEvent *)event {
    NSLog(@"Key released: %hi", [event keyCode]);

    if ([event keyCode]==125){

        [[self window] selectKeyViewFollowingView:self];
    }
    if ([event keyCode]==126){

        [[self window] selectKeyViewPrecedingView:self];
    }

}

我的密钥代码(可行):

-(void)keyUp:(NSEvent*)event
{if ([event keyCode]==125){

        [[self window] selectKeyViewFollowingView:self];
    }
    if ([event keyCode]==126){

        [[self window] selectKeyViewPrecedingView:self];
    }

    if ([event keyCode]==36){

        [[self window] selectKeyViewFollowingView:self];
    }

    }

我没看到我的keydown代码出现问题。任何建议都将被接受

编辑: 我已经读过你必须继承NSTextView而不是NSTextField。

4 个答案:

答案 0 :(得分:9)

您可以在不使用NSTextFieldDelegate方法进行子类化的情况下完成此操作:

正如@Darren Inksetter所说,你可以使用control:textView:doCommandBySelector:

首先,在接口标记中声明NSTextFieldDelegate。 然后实现方法:

- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
{
    if( commandSelector == @selector(moveUp:) ){
        // Do yourthing here, like selectKeyViewFollowingView
        return YES;    // Return YES means don't pass it along responders chain. Return NO if you still want system's action on this key.
    }
    if( commandSelector == @selector(moveDown:) ){
        // Do the same with the keys you want to track
        return YES;
    }
    return NO;
}

答案 1 :(得分:8)

无法在NSTextField中覆盖keydown事件,如果需要,可以覆盖超级视图的keydown事件,或者可以使用NSTextView或只是覆盖NSTextField中的keyup事件

答案 2 :(得分:3)

答案 3 :(得分:0)

迅速5示例。


    func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
        switch commandSelector {
        case #selector(moveUp(_:)):
            impl.tableView.doCommand(by: commandSelector)
            return true
        case #selector(moveDown(_:)):
            impl.tableView.doCommand(by: commandSelector)
            return true
        default: return false
        }
    }