Как получить выделенный диапазон текста из UITextView или UITextField

Я пытаюсь получить выбранный диапазон текста из UITextView (и/или UITextField), чтобы я мог редактировать выделенный текст или изменять строку с атрибутами. Приведенный ниже метод запускается, когда я делаю выбор, но код в методе возвращает нулевые значения.

- (void)textViewDidChangeSelection:(UITextView *)textView {

    UITextRange *selectedRange = [textField selectedTextRange];

    NSLog(@"Start: %@ <> End: %@", selectedRange.start, selectedRange.end);

}

person Mr Wolf    schedule 26.03.2013    source источник


Ответы (4)


Вы можете попробовать это,

- (void)textViewDidChangeSelection:(UITextView *)textView {

   UITextRange *selectedRange = [textView selectedTextRange];
   NSString *selectedText = [textView textInRange:selectedRange];
}
person Iducool    schedule 12.08.2013

Свифт

Сначала получите выделенный текстовый диапазон, а затем используйте этот диапазон для получения фактического текста:

if let textRange = myTextView.selectedTextRange {

    let selectedText = myTextView.text(in: textRange)

    // ...
}

Примечания:

  • Выделение текста из UITextField выполняется таким же образом.
  • Диапазон равен UITextRange, а не NSRange. Это позволяет правильно выбирать такие вещи, как смайлики и расширенные кластеры графем. Подробнее об этом см. этот ответ.
person Suragch    schedule 08.06.2016

Свифт 5.0

вот как я выбираю имя файла Panda из Panda.txt

func textFieldDidBeginEditing(_ textField: UITextField) {
    // if textField.text is `Panda.txt`, offset will be 3
    let offset = String(textField.text!.split(separator: ".").last!).length
    let from = textField.position(from: textField.beginningOfDocument, offset: 0)
    let to = textField.position(from: textField.beginningOfDocument,
                                offset:textField.text!.length - (offset+1) )
    //now `Panda` will be selected
    textField.selectedTextRange = textField.textRange(from: from!, to: to!)
    //note: unwrap with `!` is not recommended, text here is 100% not null,so it's safe
}

person Panway    schedule 19.09.2019

Свифт 4.1

В вашем расширении UITextView поместите приведенный ниже код в функцию и используйте его в своем контроллере: вы можете вызвать этот метод с вашим экземпляром textView в методе делегата SelectionDidChange из вашего контроллера представления. Лучше обернуть вызов этой функции условием textView.selectedRange.length > 0, чтобы получить текст...

  let begin = self.beginningOfDocument
  let start = self.position(from: begin, offset: selectedRange.location)
  let end = self.position(from: position(from: start!, offset: 0)!, offset: selectedRange.length)
  let txtRange = self.textRange(from: start!, to: end!)

  let txt = self.text(in: txtRange!)
  print("Sel Text is \(String(describing: txt))")

Мы не можем использовать опциональную привязку для хранения выбранного диапазона, вместо этого можно объявить опциональный тип для nsrange, после чего использовать if-let... штуку.

TextInputComponent имеет свойство получать выбранный диапазон текста.

let range = textView.selectedRange

Затем вы можете использовать значения range.location, range.length для изменения атрибутов текста в контейнере и т. д.

person Penumutchu leela prasad    schedule 23.07.2018