在NSTextfield中覆盖keydownevent

Jav*_*rán 6 cocoa objective-c 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];
    }

}
Run Code Online (Sandbox Code Playgroud)

我的密钥代码(它的工作原理):

-(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];
    }

    }
Run Code Online (Sandbox Code Playgroud)

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

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

小智 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;
}
Run Code Online (Sandbox Code Playgroud)


Jav*_*rán 8

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


Eon*_*nil 6

斯威夫特 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
        }
    }

Run Code Online (Sandbox Code Playgroud)