Изменение диапазона выбора дорожки для NSTextField (какао)

Кто-нибудь знает, как я могу отслеживать NSTextField.currentEditor.selectedRange изменения значения для NSTextField?

Есть эта замечательная вещь NSTextViewDidChangeSelectionNotification, он делает именно то, что мне нужно, но работает только для NSTextView,

Я пытался играть с KVC/KVO, но я не получил то, что хотел. Я предполагаю, что сделал что-то не так.

Я постараюсь объяснить, что мне нужно для достижения.

я имею NSTextFieldниже у меня есть метка, где я хочу поместить значения из NSTextField.currentEditor.selectedRange выбора текста выше. В режиме реального времени, т.е. я хочу постоянно обновлять содержимое метки, указав длину и начальную позицию из NSTextField.currentEditor.selectedRange при выборе области текста.

2 ответа

Как упомянуто в этой "удаленной" статье, "редактор полей" назначает текущее текстовое поле своим делегатом. Поскольку полевой редактор является NSTextView Например, мы можем реализовать любой NSTextViewDelegate метод в нашем NSTextField подкласс.

- (void)textViewDidChangeSelection:(NSNotification *)notification
{
  NSRange selection = self.currentEditor.selectedRange;
  NSLog(@"selection = (location: %lu, length: %lu)", selection.location, selection.length);
}

Наслаждайтесь! ✌️

NSTextField использует редактор полей текущего окна для фактического редактирования текста, и это NSTextView, Подписаться на NSTextViewDidChangeSelectionNotification в этом текстовом представлении вам нужно выяснить, когда ваше поле получает фокус клавиатуры, а затем запросить его currentEditor,

К сожалению, похоже controlTextDidBeginEditing: никогда не вызывается, но вы можете переопределить becomeFirstResponder чтобы получить тот же эффект (обязательно позвоните супер).

Хотя я не могу найти подходящее место для отмены подписки, поскольку текстовое поле имеет фокус клавиатуры только на долю секунды, а затем теряет его, когда оно создает и активирует редактор полей NSTextView.

Итак, в конце концов, я делаю подписку на уведомление с nil объект, когда представление создано, отписаться в dealloc и проверить, если notification.object == self.currentEditor в обработчике уведомлений и игнорируя все остальные.

Вы могли бы реализовать -windowWillReturnFieldEditor:toObject: на ваше NSWindow делегировать и вернуть другой редактор полей для интересующего вас элемента управления, возможно, с соответствующим NSTextView уведомления, настроенные только для этого редактора полей. Или, конечно, вы можете вернуть свой собственный подкласс NSTextViewхотя это, вероятно, не нужно здесь.

Другие вопросы по тегам