【问题标题】:Convert selectedTextRange UITextRange to NSRange将 selectedTextRange UITextRange 转换为 NSRange
【发布时间】:2014-02-04 15:37:00
【问题描述】:

如何将UITextRange 对象转换为NSRange?我已经看到很多关于走向另一个方向的帖子,但这与我所需要的相反。我正在使用UITextRange selectedTextRange 这是UITextView 的属性。它返回一个UITextRange,但我需要一个范围。

【问题讨论】:

    标签: ios objective-c nsrange uitextrange


    【解决方案1】:

    你需要这样的东西:

    - (NSRange) selectedRangeInTextView:(UITextView*)textView
    {
        UITextPosition* beginning = textView.beginningOfDocument;
    
        UITextRange* selectedRange = textView.selectedTextRange;
        UITextPosition* selectionStart = selectedRange.start;
        UITextPosition* selectionEnd = selectedRange.end;
    
        const NSInteger location = [textView offsetFromPosition:beginning toPosition:selectionStart];
        const NSInteger length = [textView offsetFromPosition:selectionStart toPosition:selectionEnd];
    
        return NSMakeRange(location, length);
    }
    

    【讨论】:

      【解决方案2】:

      UITextView 有一个属性

      @property(nonatomic) NSRange selectedRange;
      

      【讨论】:

      • 这不能回答 OP 的问题。您需要从 UITextRange 转换为 NSRange 的正当理由。
      • 另外,swift中不存在
      • 另外,UITextField只有selectedTextRange,所以需要转换成简单的NSRange
      【解决方案3】:

      这是基于 Vitaly S 回答的 Swift 扩展。

      extension UITextInput {
          var selectedRange: NSRange? {
              guard let range = self.selectedTextRange else { return nil }
              let location = offsetFromPosition(beginningOfDocument, toPosition: range.start)
              let length = offsetFromPosition(range.start, toPosition: range.end)
              return NSRange(location: location, length: length)
          }
      }
      

      斯威夫特 4

      extension UITextInput {
          var selectedRange: NSRange? {
              guard let range = selectedTextRange else { return nil }
              let location = offset(from: beginningOfDocument, to: range.start)
              let length = offset(from: range.start, to: range.end)
              return NSRange(location: location, length: length)
          }
      }
      

      【讨论】:

        【解决方案4】:

        斯威夫特 5

        extension UITextInput
        {
            var selectedRange: NSRange?
            {
                if let selectedRange = self.selectedTextRange
                {
                   return NSMakeRange(self.offset(from: self.beginningOfDocument, to: selectedRange.start),
                                      self.offset(from: selectedRange.start,      to: selectedRange.end))
                }
                else
                {
                    return nil
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多