Запретить выбор всех токенов в NSTokenField - PullRequest
3 голосов
/ 08 июня 2010

Есть ли способ запретить NSTokenField выбирать все при нажатии клавиши ВВОД или при обращении к первому респонденту, возможно, с помощью клавиши TAB?

1 Ответ

7 голосов
/ 09 июня 2010

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 делать свое дело, а затем проверяет, является ли он первым респондентом,Если это так, он делает то же, что и выше: помещает символ вставки в конец поля.

Обратите внимание, что это поведение не является стандартным и является неожиданным.Используйте экономно.

...