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

程式执行结果:

以上为范例程式部分内容的说明,详细内容请参照范例程式。

范例程式

参考资讯