我正在尝试从UITextView(和/或UITextField)获取所选文本范围,以便我可以编辑所选文本或修改属性字符串。我做出选择时会触发下面的方法,但方法中的代码会返回空值。
- (void)textViewDidChangeSelection:(UITextView *)textView {
UITextRange *selectedRange = [textField selectedTextRange];
NSLog(@"Start: %@ <> End: %@", selectedRange.start, selectedRange.end);
}
答案 0 :(得分:14)
你可以试试这个,
- (void)textViewDidChangeSelection:(UITextView *)textView {
UITextRange *selectedRange = [textView selectedTextRange];
NSString *selectedText = [textView textInRange:selectedRange];
}
答案 1 :(得分:2)
<强>夫特强>
首先获取所选文本范围,然后使用该范围获取实际文本:
if let textRange = myTextView.selectedTextRange {
let selectedText = myTextView.text(in: textRange)
// ...
}
备注:强>
UITextField
中选择文字的方式相同。UITextRange
,而不是NSRange
。这允许正确选择诸如表情符号和扩展的字形簇之类的东西。有关此问题的详细信息,请参阅this answer。答案 2 :(得分:0)
Swift 4.1
在您的UITextView
扩展名中,将以下代码放入函数中,并在控制器中使用该代码:
您可以在view-Controller的SelectionDidChange委托方法中使用textView实例调用此方法。最好使用条件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
值来更改容器中文本的属性,等等。
答案 3 :(得分:0)
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
}