Как получить выделенный текст из моего NSTextField?

#objective-c #nstextfield

#objective-c #nstextfield

Вопрос:

Это, безусловно, должно быть легко, но я ничего не нашел в документе. Поведение, которое мне нужно, точно такое же, как при щелчке правой кнопкой мыши на любой части текста, а затем вы можете выполнить с ним некоторые действия. На данный момент у меня есть собственный пользовательский класс NSTextField, который повторно реализует действие «Наведение курсора мыши». Эта часть работает! Я думал, что смогу получить выделенную часть текста моего nstextfield благодаря ‘theEvent’, но, видимо, это невозможно.

Ответ №1:

На самом деле я не думаю, что вы можете сделать это с помощью NSTextField. Я думаю, что вместо этого вам нужно использовать NSTextView, а затем использовать -selectedRanges метод.

РЕДАКТИРОВАТЬ: я должен был сказать, что вы не можете сделать это напрямую (т. Е. для этого нет метода NSTextField). Я думаю, скорее, вам нужно использовать редактор полей (который сам по себе является NSTextView), связанный с окном, чтобы сделать это. Вот руководство Apple по использованию редактора полей.

Комментарии:

1. Да, я думал об этом… но я бы предпочел остаться со своим NSTextField… Но опять же, многие приложения могут делать это в NSTextField… Итак, мне было интересно…

2. прохладный. я отредактировал свой приведенный выше ответ, чтобы быть (надеюсь) более полезным.

3. Это кажется довольно интересным! Спасибо!

4. Неработающая ссылка; обновлена = developer.apple.com/library/mac/documentation/TextFonts / …

Ответ №2:

 NSString *selectedText = ((NSTextFieldCell*)textField.selectedCell).stringValue;
  

Ответ №3:

Добавляя к ответу @Sean, я использую следующее решение для получения / изменения выделенного текста в NSTextField:

 - (BOOL) replaceSelectionOfField:(NSTextField *)textField withString:(NSString *)replacement {
    NSText * editor = [self.view.window fieldEditor:NO forObject:textField];
    if (editor) {
        NSRange rng = editor.selectedRange;
        if (rng.location != NSNotFound) {
            [editor replaceCharactersInRange:rng withString:replacement];
            return YES;
        }
    }
    return NO;
}
  

Если эта функция возвращает NO , либо нет редактора полей (текстовое поле может не иметь фокуса), либо нет выделения.