Отмена выбора текста в NSTextField
Работая над новым приложением, я сталкиваюсь с той же проблемой, описанной здесь в отношении отмены выбора текста, который вводится в поле nstext: http://www.cocoabuilder.com/archive/cocoa/195313-nstextfield-how-to-deselect-text.html
В SO много вопросов о том, как это сделать с помощью NSTextViews, но мне не удалось найти рабочий ответ для NSTextFields.
В моем проекте у меня есть окно с текстовым полем в нем с классом контроллера, который также является делегатом текстового поля. У меня есть IBAction для текстового поля, которое отправляется при вводе, которое выполняет действия в зависимости от текста в поле, а также:
(void)controlTextDidChange:(NSNotification *)note
а также
(BOOL)control:(NSControl *)control
textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
которые обрабатывают некоторые пользовательские автозаполнения, как в ответ на Подавление раскрывающегося текста завершения для NSTextField
Моя проблема заключается в том, что когда я нажимаю клавишу ВВОД, чтобы отправить введенный текст, строка в поле полностью выделяется, но я хотел бы иметь возможность отменить выделение текста и иметь точку вставки в конце, как описано в первой ссылке.
Есть несколько мест, где можно отменить выделение текста, но на самом деле отмена выбора не работает. Я попытался получить редактор полей, как описано в первой ссылке, я также попытался использовать метод controlTextDidEndEditing: так как я действительно получаю редактор полей в controlTextDidChange: метод выше:
- (void)controlTextDidEndEditing:(NSNotification *)note{
NSTextView *textView = [[note userInfo] objectForKey:@"NSFieldEditor"];
[textView setSelectedRange:NSMakeRange([[self.ParseField stringValue]length]-1, 0)
affinity:NSSelectionAffinityUpstream
stillSelecting:NO];
}
Я также попытался отключить и снова включить редактирование на поле, но это тоже не сработало.
Что-то такое же простое, как возможность отправить сообщение moveDown: текстовое поле для меня, будет работать так же, как нажатие стрелки вниз, но текстовое поле не распознает этот селектор. (Я думал, что NSTextField унаследован от NSResponder, так что это сработало бы, но я не думаю, что?)
Спасибо за любую помощь
3 ответа
В простом приложении с окном и текстовым полем.
Я установил для textField значение firstResponder.
Это делает текст выделенным при запуске приложения.
Если я добавлю в приложение DidFinishLaunching
NSRange tRange = [[ _theTextField currentEditor] selectedRange];
[[ _theTextField currentEditor] setSelectedRange:NSMakeRange(tRange.length,0)];
Теперь при запуске текст не выделен и точка вставки находится в конце текста.
Я использовал selectedRange, чтобы получить длину символа выделения. Поскольку текст был выделен в первую очередь и покажется более простым.
- (void)awakeFromNib{
[_theTextField setStringValue:@"100000"];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[[[NSApplication sharedApplication] mainWindow] makeFirstResponder:_theTextField];
NSRange tRange = [[ _theTextField currentEditor] selectedRange];
[[ _theTextField currentEditor] setSelectedRange:NSMakeRange(tRange.length,0)];
}
Я искал решение в Swift 3, поэтому вот что сработало для меня:
theTextField.currentEditor()?.selectedRange = NSMakeRange(0, 0)
Для меня решение Жюльена работало нормально, я только что использовал NSRange вместо NSMakeRange:textField.currentEditor()?.selectedRange = NSRange(location: 0, length: 0)
Но чтобы курсор переместился в конец текста, мне пришлось явно определить диапазон, вот пример:
let endIndex = someText.endIndex
textField.stringValue = someText
let range = NSRange(location: endIndex.utf16Offset(in: someText), length: 0)
textField.currentEditor()?.selectedRange = range
Использование Swift 5.7