Есть ли способ запретить NSTokenField выбирать все при нажатии клавиши ENTER или при обращении к первому респонденту, возможно, с помощью клавиши TAB?
Запретить выбор всех токенов в NSTokenField
Ответы (1)
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 делать свое дело, а затем проверяет, остается ли он первым респондентом. Если это так, он делает то же, что и выше: помещает вставляемый карат в конец поля.
Обратите внимание, это поведение нестандартно и неожиданно. Используйте экономно.