3

有没有什么办法可以防止 NSTokenField 在按下 ENTER 键或使用 TAB 键对第一响应者进行选择时选择所有内容?

4

1 回答 1

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 做它的事情,然后它会查看它是否仍然是第一响应者。如果是,则执行与上述相同的操作:将插入克拉放在字段的末尾。

请注意,这种行为不是标准的并且是意外的。谨慎使用。

于 2010-06-09T18:15:13.830 回答