防止在NSTokenField中选择所有令牌

Rob*_*ert 3 cocoa appkit

是否有任何方法可以阻止NSTokenField在按ENTER键时选择所有内容,或者当使用TAB键向第一个响应者发送时?

Jos*_*zzi 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;
}
Run Code Online (Sandbox Code Playgroud)

此代码首先查看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)];
}
Run Code Online (Sandbox Code Playgroud)

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

请注意,此行为不是标准的,并且是意外的.谨慎使用.