BDGapps
BDGapps

Reputation: 3356

UITextPosition to NSRange

I need to use NSStringFromRange but I only have a start and end UITextPositions. How do you convert UITextPosition to 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;
}

Upvotes: 18

Views: 10748

Answers (4)

Serge B.
Serge B.

Reputation: 822

Swift3 version

    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)
}

Upvotes: 5

Sunil Sharma
Sunil Sharma

Reputation: 2689

Swift 2 version for @Peter Lapisu answer

Method 1: As function

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)
    }

Method 2: As extension

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)
    }
}

Upvotes: 2

Peter Lapisu
Peter Lapisu

Reputation: 20965

- (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);
}

Upvotes: 8

rob mayoff
rob mayoff

Reputation: 385500

Try this:

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)];

Upvotes: 24

Related Questions