2014-05-12 16 views
3

我一直在搜索高和低,无法弄清楚如何做到这一点。可以说,我有一个这样的字符串:使用UITextPosition,从文本中获取前一个字符InRange

NSString *string = @"&foo !foo"; 

我试图做的是两个FOOS区分(听起来很可笑哈哈)文本视图中。当我点击一个时,我想知道哪个(&或!)出现在它之前。以下是我如何得到这个词:

UITapGestureRecognizer *recognizer = (UITapGestureRecognizer *)sender; 
UITextView *TV = (UITextView*)recognizer.view; 
CGPoint location = [recognizer locationInView:TV]; 
location.y += TV.contentOffset.y; 
UITextPosition *tapPosition = [TV closestPositionToPoint:CGPointMake(location.x, location.y)]; 
UITextRange *textRange = [TV.tokenizer rangeEnclosingPosition:tapPosition 
    withGranularity:UITextGranularityWord inDirection:UITextLayoutDirectionRight]; 
NSString *tappedWord = [TV textInRange:textRange]; 

我不知道如何获得以前的字符。 TV.tokenizerUITextGranularityCharacter只能得到最接近的字母,而不是符号。任何解决方案?

回答

4

检查:Convert selectedTextRange UITextRange to NSRange将您的UITextRange转换为NSRange(我将打电话给selectedRange)。

激励我与以前的答案的链接的问题,你需要在你的代码的最后补充一点:

UITextPosition *beginning = TV.beginningOfDocument; 
UITextPosition *selectionStart = textRange.start; 
UITextPosition *selectionEnd = textRange.end; 
NSInteger location = [TV offsetFromPosition:beginning toPosition:selectionStart]; 
NSInteger length = [TV offsetFromPosition:selectionStart toPosition:selectionEnd]; 
NSRange selectedRange = NSMakeRange(location,lenght); 
NSRange range = NSMakeRange(selectedRange.location-1,1) //Maybe need to check if selectedRange.location>0 
NSString *yourCharString = [[TV text] substringWithRange:range]; 
+0

感谢您的答复。我之前看过那篇文章。在创建新的NSRange之前,我必须将我的UITextRange转换为NSRange? – denikov

+1

是的,你必须将'UITextRange'(我修正了“NSTextRange”)转换为'NSRange'。 – Larme

+0

好的谢谢。尽管我仍然对如何做到这一点感到困惑。我有水龙头的位置,我是否仍然需要将它分解为UITextPosition selectionStart和selectionEnd? – denikov

相关问题