【问题标题】:How to get a selected range of text from a UITextView or UITextField如何从 UITextView 或 UITextField 获取选定范围的文本
【发布时间】:2013-03-15 20:25:21
【问题描述】:

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

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

    UITextRange *selectedRange = [textField selectedTextRange];

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

}

【问题讨论】:

    标签: ios uitextfield uitextview nsattributedstring uitextrange


    【解决方案1】:

    Swift 5.0

    这是我从Panda.txt中选择文件名Panda的方法

    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
    }
    
    

    【讨论】:

      【解决方案2】:

      斯威夫特 4.1

      在您的 UITextView 扩展中,将以下代码放入一个函数中,并在您的控制器中使用它: 您可以在视图控制器的 SelectionDidChange 委托方法中使用 textView 实例调用此方法。最好用条件textView.selectedRange.length &gt; 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.locationrange.length值来改变容器中文本的属性等等...

      【讨论】:

        【解决方案3】:

        斯威夫特

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

        if let textRange = myTextView.selectedTextRange {
        
            let selectedText = myTextView.text(in: textRange)
        
            // ...
        }
        

        注意事项:

        • UITextField 中选择文本的方法相同。
        • 范围是UITextRange,而不是NSRange。这允许正确选择诸如表情符号和扩展字素簇之类的东西。请参阅this answer 了解相关详情。

        【讨论】:

          【解决方案4】:

          你可以试试这个,

          - (void)textViewDidChangeSelection:(UITextView *)textView {
          
             UITextRange *selectedRange = [textView selectedTextRange];
             NSString *selectedText = [textView textInRange:selectedRange];
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-10-08
            • 2012-02-24
            • 2011-07-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-25
            • 1970-01-01
            相关资源
            最近更新 更多