2011-05-06 83 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