Reputation: 3356
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
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
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
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
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