Ответ 1
Вы можете попробовать это,
- (void)textViewDidChangeSelection:(UITextView *)textView {
UITextRange *selectedRange = [textView selectedTextRange];
NSString *selectedText = [textView textInRange:selectedRange];
}
Я пытаюсь получить выбранный диапазон текста из UITextView (или UITextField), чтобы я мог редактировать выделенный текст или изменять атрибутную строку. Метод, приведенный ниже, запускается, когда я делаю выбор, но код в методе возвращает нулевые значения.
- (void)textViewDidChangeSelection:(UITextView *)textView {
UITextRange *selectedRange = [textField selectedTextRange];
NSLog(@"Start: %@ <> End: %@", selectedRange.start, selectedRange.end);
}
Вы можете попробовать это,
- (void)textViewDidChangeSelection:(UITextView *)textView {
UITextRange *selectedRange = [textView selectedTextRange];
NSString *selectedText = [textView textInRange:selectedRange];
}
Swift
Сначала получите выделенный диапазон текста, а затем используйте этот диапазон, чтобы получить фактический текст:
if let textRange = myTextView.selectedTextRange {
let selectedText = myTextView.text(in: textRange)
// ...
}
Примечания:
UITextField
выполняется таким же образом.UITextRange
, а не NSRange
. Это позволяет правильно выбирать такие вещи, как emoji и расширенные кластеры grapheme. См. этот ответ для получения дополнительных сведений об этом.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
для изменения атрибутов текста в контейнере и т.д.
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
}