Как получить выбранный диапазон текста из 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
значения для изменения атрибутов текста в контейнере и т.д...