2011-05-06 79 views
6

我做了nstextfield的子类,我重写了keydown事件,但我的代码不起作用,然后我重写了de keyup事件并且代码完美地工作。 我的keydown代码(不工作):在NSTextfield覆盖keydownevent

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

+0

请提供描述“不起作用”的详细信息。 – 2011-05-06 20:30:21

+1

它执行NSLog吗?它是否被称为?这些是同一个确切类的相同确切实例吗? – 2011-05-06 22:29:03

+0

它不执行nslog – 2011-05-09 02:31:56

回答

7

KeyDown事件不能在的NSTextField被重写,如果你愿意,你可以覆盖超视图的keydown事件,或者你可以使用一个NSTextView或者只是覆盖keyup事件中的NSTextField

8

您可以通过使用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; 
} 
+0

这个协议函数显然不存在了。 (macOS 10.13) – gerbil 2017-11-30 17:38:28