【问题标题】:Override keydownevent in NSTextfield覆盖 NSTextfield 中的 keydownevent
【发布时间】:2011-05-06 17:28:16
【问题描述】:

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

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

}

我的keyup代码(有效):

-(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。

【问题讨论】:

  • 请提供描述“不起作用”的详细信息。
  • 它执行 NSLog 吗?它被调用了吗?这些是同一类的完全相同的实例,其中一个有效,一个无效?
  • 您在这里混淆了术语。您没有“覆盖”该事件,您只是在听它。如果你要覆盖它,你会让它做一些它原本打算做的事情。
  • 好的,但这对我没有帮助

标签: objective-c cocoa nstextfield


【解决方案1】:

您可以使用 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;
}

【讨论】:

【解决方案2】:

不能在 NSTextField 中覆盖 keydown 事件,如果需要,可以覆盖超级视图的 keydown 事件,也可以使用 NSTextView 或仅覆盖 NSTextField 中的 keyup 事件

【讨论】:

    【解决方案3】:
    【解决方案4】:

    Swift 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
            }
        }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2012-01-28
      • 2012-07-18
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多