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

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

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

    UITextRange *selectedRange = [textField selectedTextRange];

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

}

Ответ 1

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

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

   UITextRange *selectedRange = [textView selectedTextRange];
   NSString *selectedText = [textView textInRange:selectedRange];
}

Ответ 2

Swift

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

if let textRange = myTextView.selectedTextRange {

    let selectedText = myTextView.text(in: textRange)

    // ...
}

Примечания:

  • Выбор текста из UITextField выполняется таким же образом.
  • Диапазон: UITextRange, а не NSRange. Это позволяет правильно выбирать такие вещи, как emoji и расширенные кластеры grapheme. См. этот ответ для получения дополнительных сведений об этом.

Ответ 3

Swift 4.1

В вашем UITextView Extension поместите приведенный ниже код в функцию и используйте его в своем контроллере: Вы можете вызвать этот метод с вашим экземпляром textView в методе делегата SelectionDidChange из вашего view-Controller. Лучше обернуть этот вызов функции условием 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 для изменения атрибутов текста в контейнере и т.д.

Ответ 4

Swift 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 safe
}