13

我正在尝试从 UITextView(和或 UITextField)中获取选定的文本范围,以便我可以编辑选定的文本或修改属性字符串。当我进行选择时,会触发下面的方法,但是方法中的代码返回 null 值。

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

    UITextRange *selectedRange = [textField selectedTextRange];

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

}
4

4 回答 4

16

你可以试试这个

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

   UITextRange *selectedRange = [textView selectedTextRange];
   NSString *selectedText = [textView textInRange:selectedRange];
}
于 2013-08-12T07:14:14.490 回答
7

迅速

首先获取选定的文本范围,然后使用该范围获取实际文本:

if let textRange = myTextView.selectedTextRange {

    let selectedText = myTextView.text(in: textRange)

    // ...
}

笔记:

  • 从 a 中选择文本UITextField以相同的方式完成。
  • 范围是 a UITextRange,而不是NSRange。这允许正确选择诸如表情符号和扩展字素簇之类的东西。有关此问题的相关详细信息,请参阅此答案
于 2016-06-08T02:37:31.663 回答
2

斯威夫特 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
}

于 2019-09-19T08:23:32.947 回答
0

斯威夫特 4.1

在您的UITextView扩展中,将以下代码放入一个函数中,并在您的控制器中使用它:您可以在视图控制器的 SelectionDidChange 委托方法中使用您的 textView 实例调用此方法。最好用 condition 包装这个函数调用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.lengthvalues 来更改容器中文本的属性等...

于 2018-07-23T08:51:45.120 回答