29

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

4

4 回答 4

58

你需要这样的东西:

- (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);
}
于 2014-01-15T22:52:22.203 回答
19

这是基于 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)
    }
}
于 2016-08-06T14:02:04.490 回答
8

UITextView有财产

@property(nonatomic) NSRange selectedRange;
于 2014-06-17T12:07:18.160 回答
1

斯威夫特 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
        }
    }
}
于 2020-08-24T06:44:28.120 回答