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

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

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

    UITextRange *selectedRange = [textField selectedTextRange];

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

}

3 ответа

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

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

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

стриж

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

if let textRange = myTextView.selectedTextRange {

    let selectedText = myTextView.text(in: textRange)

    // ...
}

Заметки:

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

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's safe
}

Swift 4.1

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

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