Изменение диапазона выбора дорожки для 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
хотя это, вероятно, не нужно здесь.