UITextPosition для NSRange

Мне нужно использовать NSStringFromRange, но у меня есть только начальные и конечные UITextPosition. Как вы конвертируете UITextPosition в NSRange.

NSMutableArray * wordArray = [[NSMutableArray alloc]init];
id<UITextInputTokenizer> tokenizer = tv.tokenizer;
UITextPosition *start = tv.beginningOfDocument;
while (![start isEqual:tv.endOfDocument]) {
    UITextPosition *end = [tokenizer positionFromPosition:start toBoundary:UITextGranularityWord inDirection:UITextStorageDirectionForward];
    NSString *word = [tv textInRange:[tv textRangeFromPosition:start toPosition:end]];
    [wordArray addObject:NSStringFromRange(<#NSRange range#>)];
    start = end;
}

Ответы

Ответ 1

Попробуйте следующее:

NSInteger startOffset = [tv offsetFromPosition:tv.beginningOfDocument toPosition:start];
NSInteger endOffset = [tv offsetFromPosition:tv.beginningOfDocument toPosition:end];
NSRange offsetRange = NSMakeRange(startOffset, endOffset - startOffset);
[wordArray addObject:NSStringFromRange(offsetRange)];

Ответ 2

- (NSRange)rangeFromTextRange:(UITextRange *)textRange inTextView:(UITextView*)textView {

    UITextPosition* beginning = textView.beginningOfDocument;
    UITextPosition* start = textRange.start;
    UITextPosition* end = textRange.end;

    const NSInteger location = [textView offsetFromPosition:beginning toPosition:start];
    const NSInteger length = [textView offsetFromPosition:start toPosition:end];

    return NSMakeRange(location, length);
}

Ответ 3

версия Swift 2 для ответа @Peter Lapisu

Метод 1: как функция

func rangeFromTextRange(textRange:UITextRange,textView:UITextView) -> NSRange {
        let location:Int = textView.offsetFromPosition(textView.beginningOfDocument, toPosition: textRange.start)
        let length:Int = textView.offsetFromPosition(textRange.start, toPosition: textRange.end)
        return NSMakeRange(location, length)
    }

Метод 2: как расширение

extension UITextView {
    func rangeFromTextRange(textRange:UITextRange) -> NSRange {
        let location:Int = self.offsetFromPosition(self.beginningOfDocument, toPosition: textRange.start)
        let length:Int = self.offsetFromPosition(textRange.start, toPosition: textRange.end)
        return NSMakeRange(location, length)
    }
}

Ответ 4

версия Swift3

    func angeFromTextRange(textRange:UITextRange,textView:UITextView) -> NSRange {
       let location:Int = textView.offset(from: textView.beginningOfDocument, to: textRange.start)
       let length:Int = textView.offset(from: textRange.start, to: textRange.end)
       return NSMakeRange(location, length)
}