防止在NSTokenField中选择所有令牌

时间:2010-06-08 06:27:52

标签: cocoa appkit

有没有办法阻止NSTokenField在按下ENTER键时选择所有内容,或者当使用TAB键向第一响应者发送时?

1 个答案:

答案 0 :(得分:7)

NSTokenField是NSTextField的子类。直接操作这些类的选择没有简单直接的方法(除了-selectText:,它选择所有类)。

要在它成为第一个响应者时执行此操作,您需要继承NSTokenField(请记住将XIB中的字段类设置为自定义子类的字段)并覆盖-becomeFirstResponder,如下所示:

- (BOOL)becomeFirstResponder
{
    if ([super becomeFirstResponder])
    {
        // If super became first responder, we can get the
        // field editor and manipulate its selection directly
        NSText * fieldEditor = [[self window] fieldEditor:YES forObject:self];
        [fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length], 0)];
        return YES;
    }
    return NO;
}

此代码首先查看super是否回答“是”(并成为第一个响应者)。如果是,我们知道它将有一个字段编辑器(一个NSText实例),我们可以直接操作它们的选择。所以我们得到它的字段编辑器并设置它的选定范围(我将插入点放在最后一个{lastchar,nolength}范围内)。

要在字段完成编辑(返回,跳出等)时执行此操作,请覆盖-textDidEndEditing:像这样:

- (void)textDidEndEditing:(NSNotification *)aNotification
{
    [super textDidEndEditing:aNotification];
    NSText * fieldEditor = [[self window] fieldEditor:YES forObject:self];
    [fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length], 0)];
}

在这种情况下,当用户结束编辑时,此方法让super执行其操作,然后查看它是否仍然是第一个响应者。如果是,则它与上面相同:将插入克拉放在字段的末尾。

请注意,此行为不是标准的,也是意外的。谨慎使用。