NSTextField 取得特殊按鍵事件(Enter、Delete、Insert)

NSTextField 取得特殊按鍵事件(Enter、Delete、Insert)

Mac程式上使用NSTextField元件時,必需要取消某些特殊按鍵功能時該怎麼處理呢?或是你想要按下Enter時可以全選文字或是檢查內容該怎麼做呢?

NSTextField要取得特殊按鍵事件必需要設定它的Delegate:NSControlTextEditingDelegate,並且增加Method:

- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector;

所以在這Delegate中將doCommandBySelector傳遞的Message給印出來:

//-----------start-----------
- (BOOL)control:(NSControl*)control textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector
{
    BOOL result = NO;

    NSLog(@"entered control area = %@", NSStringFromSelector(commandSelector));
    return result;
}
//------------end------------

其中就會看到像下面的事件回報:

2014-04-29 17:31:28.478 NSTextFieldGetKey[99447:303] moveToBeginningOfLine:
2014-04-29 17:31:28.943 NSTextFieldGetKey[99447:303] scrollPageUp:
2014-04-29 17:31:29.360 NSTextFieldGetKey[99447:303] scrollPageDown:
2014-04-29 17:31:30.079 NSTextFieldGetKey[99447:303] moveToEndOfLine:
2014-04-29 17:31:30.994 NSTextFieldGetKey[99447:303] moveRight:
2014-04-29 17:31:31.459 NSTextFieldGetKey[99447:303] moveLeft:
2014-04-29 17:31:31.842 NSTextFieldGetKey[99447:303] moveDown:
2014-04-29 17:31:32.239 NSTextFieldGetKey[99447:303] moveUp:
2014-04-29 17:31:34.162 NSTextFieldGetKey[99447:303] insertNewline:
2014-04-29 17:31:35.304 NSTextFieldGetKey[99447:303] deleteForward:
2014-04-29 17:31:36.160 NSTextFieldGetKey[99447:303] deleteBackward:


假設我們要在按下Enter後做一些處理,可以將程式改成:

//-----------start-----------
- (BOOL)control:(NSControl*)control textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector
{
    BOOL result = NO;
    NSLog(@"%@", NSStringFromSelector(commandSelector));
    if ( [NSStringFromSelector(commandSelector) isEqualToString:@"insertNewline:"])
    {
        [textView selectAll:self];
        result = YES;
    }
    return result;
}
//------------end------------

程式中的insertNewline代表的就是您按下的Enter,按下Enter時 全選文字 ,全選文字的Method為selectAll, 結果像下面圖示:

如果你只是單純的要取消某些按鍵的功能的話,你只要在返回值給YES就能取消了,像下面程式將Backspace(deleteBackward:)取消:

//-----------start-----------
- (BOOL)control:(NSControl*)control textView:(NSTextView*)textView doCommandBySelector:(SEL)commandSelector
{
    BOOL result = NO;
    NSLog(@"%@", NSStringFromSelector(commandSelector));
    if ( [NSStringFromSelector(commandSelector) isEqualToString:@"deleteBackward:"])
    {
        NSLog(@"deleteBackward to cancel");
        result = YES;
    }
    return result;
}
//------------end------------

程式執行結果:

以上為範例程式部分內容的說明,詳細內容請參照範例程式。

範例程式

參考資訊