Установите selectedRange, когда NSTextField становится сфокусированным - PullRequest
0 голосов
/ 21 февраля 2019

Я переопределяю becomeFirstResponder, чтобы знать, когда мой NSTextField сфокусирован.Сосредоточившись, я пытаюсь переместить курсор до конца.Следующий фрагмент не работает:

@interface MyTextField : NSTextField
@end

@implementation MyTextField

- (BOOL)becomeFirstResponder
{
  if ([super becomeFirstResponder]) {
    self.currentEditor.selectedRange = NSMakeRange(self.stringValue.length, 0);
    return YES;
  }
  return NO;
}

@end

Переопределив textView:didChangeSelection:, я обнаружил, что выбор сделан, но затем он перезаписывается некоторым внутренним кодом, который запускается в ответ на событие NSEventTypeLeftMouseDown.

Логи выглядят так:

location=0, length=25

location=25, length=0 // The desired selection.

location=0, length=0

location=5, length=0 // Where the user clicked.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Используйте performSelector:withObject:afterDelay: изнутри becomeFirstResponder, чтобы убедиться, что selectedRange установлено после события NSEventTypeLeftMouseDown.

- (BOOL)becomeFirstResponder
{
  if ([super becomeFirstResponder]) {
    [self performSelector:@selector(textFieldDidFocus) withObject:nil afterDelay:0.0];
    return YES;
  }
  return NO;
}

- (void)textFieldDidFocus
{
  self.currentEditor.selectedRange = NSMakeRange(self.stringValue.length, 0);
}
0 голосов
/ 22 февраля 2019

Переопределите метод mouseDown: в вашем подклассе NSTextField.

Затем установите selectedRange после вызова super.

- (void)mouseDown:(NSEvent *)event
{
  [super mouseDown:event];
  self.currentEditor.selectedRange = NSMakeRange(self.stringValue.length, 0);
}

NSTextFieldметод mouseDown: вызывается только тогда, когда его "редактор полей" еще не сфокусирован, поэтому пользователь все еще может изменить выбор после того, как NSTextField получает фокус.

Это не идеальное решение, потому чтопользователь мог сфокусировать NSTextField косвенно (например, клавишей Tab).Вы всегда можете установить selectedRange в mouseDown: и becomeFirstResponder.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...