Преобразование selectedTextRange UITextRange в NSRange

Как преобразовать объект UITextRange в объект NSRange? Я видел много сообщений SO о том, чтобы пойти в другом направлении, но это противоположно тому, что мне нужно. Я использую UITextRange selectedTextRange, который является свойством UITextView. Он возвращает UITextRange, но мне нужен диапазон.


person Milo    schedule 15.01.2014    source источник


Ответы (4)


Вам нужно что-то вроде этого:

- (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);
}
person Vitaly S.    schedule 15.01.2014

Вот расширение 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)
    }
}
person Daniel Wood    schedule 06.08.2016

UITextView имеет свойство

@property(nonatomic) NSRange selectedRange;
person yasirmturk    schedule 17.06.2014
comment
Это не отвечает на вопрос ОП. Есть веские причины, по которым вам нужно преобразовать UITextRange в NSRange. - person Stunner; 01.03.2015
comment
Кроме того, он не существует в быстром - person Daniel; 09.02.2016
comment
Кроме того, UITextField имеет только selectedTextRange, поэтому вам нужно преобразовать его в простой NSRange. - person Leslie Godwin; 24.08.2020

Свифт 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
        }
    }
}
person Leslie Godwin    schedule 24.08.2020