• oc之在自定义NSTextField中响应键盘消息


    在自定义NSTextField中响应键盘消息

    2011年10月04日 23:12:50 胖次在哪里 阅读数:1214

    这个代码做的事情很简单,按键盘的“上”,文本框中的数字会增加,反之,按“下”,文本框中的数字会减少。 

    开始时,我们过滤掉除数字键之外不需要的按键,保留箭头按键。

    if ( [theArrow length] == 0 ) {

    return;            // reject dead keys

    }

    if ( [theArrow length] == 1 ) {

    // Grab just the key pressed

    unichar keyChar = [theArrow characterAtIndex:0];

    接着,我们获取到一个字符,代表按下的键(上箭头或者下箭头)

    if ([theEvent modifierFlags] & NSNumericPadKeyMask) {

    NSString *theArrow = [theEvent charactersIgnoringModifiers];

    下面的内容处理“上”箭头和“下”箭头的按键。

    // If it was an up arrow key

    if ( keyChar == NSUpArrowFunctionKey ) {

    // Setup the loop, wrapping action between bounds

    if ( [[self stringValue] doubleValue] < [stepper maxValue] ) {

    NSNumber *value = [NSNumber numberWithInt:[[self stringValue] intValue] + 1];

    [self setStringValue:[value stringValue]];

    } else if ( [[self stringValue] doubleValue] >= [stepper maxValue] ) {

    [self setStringValue:@"1"];

    }

    }

    // if it was a down arrow key

    else if ( keyChar == NSDownArrowFunctionKey ) {

    // Setup loop, wrapping action between bounds 

    if ( [[self stringValue] doubleValue] > 1 ) {

    NSNumber *value = [NSNumber numberWithInt:[[self stringValue] intValue] - 1];

    [self setStringValue:[value stringValue]];

    } else if ( [[self stringValue] doubleValue] <= 1 ) {

    [self setStringValue:[NSString stringWithFormat:@"%.0lf", [stepper maxValue]]];

    }

    }

    需要注意的是我们获取keyUp:消息,这是因为keyDown:消息已经被NSTextField事先截获了。

    这样,当用户按“下”箭头,输入框中的数字会减一,按“上”箭头,会加一。如果数字超过maxValue,将返回为1,如果小于1,将返回最大值(maxValue)。

    如果你要对NSTextField做点事情,那么你可以在这里下载这个例子。

    http://www.cocoachina.com/b/?p=169#more-169

    Mac程式上使用NSTextField元件时,必需要取消某些特殊按键功能时该怎么处理呢?或是你想要按下Enter时可以全选文字或是检查内容该怎么做呢?

    pastedGraphic.png

    NSTextField要取得特殊按键事件必需要设定它的Delegate:NSControlTextEditingDelegate,并且增加Method:

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

    所以在这Delegate中将doCommandBySelector传递的Message给印出来:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    //-----------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后做一些处理,可以将程式改成:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    //-----------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, 结果像下面图示:

    pastedGraphic.png

    如果你只是单纯的要取消某些按键的功能的话,你只要在返回值给YES就能取消了,像下面程式将Backspace(deleteBackward:)取消:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

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

    程式执行结果:

    pastedGraphic_1.png

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

  • 相关阅读:
    curl 抓取图片
    checkbox 全选
    大文件断点上传 js+php
    php快速排序
    直接插入排序(Straight Insertion Sort)
    选择排序 Selection sort
    57.猴子吃桃问题
    56.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
    55.输入两个正整数m和n,求其最大公约数和最小公倍数
    54.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
  • 原文地址:https://www.cnblogs.com/sundaymac/p/10330587.html
Copyright © 2020-2023  润新知