在数组和 return 索引号中查找文本
Find text in array and return index number
我在文本视图中显示由 \n
或换行符分隔的字符串数组。感谢 \n
,如果文本视图中有空间,每个字符串都有自己的行。但是,如果 textview 的宽度小于字符串,则 textview 会自动换行到下一行,这样字符串实际上占两行。到目前为止没有任何问题。
但是,如果有人触摸它,我想抓住它。如果字符串适合一行,它就可以正常工作。但是,如果字符串已被 textview 分成两行,如果用户触摸了第一行,我需要附加下面的行以获取整个字符串。或者如果用户触及底线,我需要获取并添加前一个以获得整个字符串。
任何人都可以建议正确的方法吗?
这是我的代码,它抓取了人触摸的线,但是,当它试图计算数组中字符串的索引时,它只得到触摸的线并且失败了。
感谢任何建议:
- (void) handleTap:(UITapGestureRecognizer *)recognizer{
UITextView *textView = (UITextView *)recognizer.view;
CGPoint location = [recognizer locationInView:textView];
CGPoint position = CGPointMake(location.x, location.y);
UITextPosition *tapPosition = [textView closestPositionToPoint:position];
UITextRange *textRange = [textView.tokenizer rangeEnclosingPosition:tapPosition withGranularity:UITextGranularityLine inDirection:UITextLayoutDirectionRight];
//In following line, I am not getting the full text in the string, only the text of that line. I need to get the whole string.
NSString *tappedLine = [textView textInRange:textRange];
NSArray* myArray = [self.listSub.text componentsSeparatedByString:@"\n"];
NSInteger indexOfTheObject = [myArray indexOfObject: tappedLine];
//If the tapped line is not the same thing as the string, the above index becomes huge number like 94959494994949494 ie an error, not the index I want.
}
您可能想研究使用 UITableView
https://developer.apple.com/documentation/uikit/uitableview
您可以为数组中的每个条目创建一个带有文本视图的单元格,当用户与任何单元格交互时您将收到委托调用
这确实是可以的。
首先,您需要将粒度更改为UITextGranularityParagraph
:
UITextRange *textRange = [textView.tokenizer rangeEnclosingPosition:tapPosition withGranularity:UITextGranularityParagraph inDirection:UITextLayoutDirectionRight];
这将 return 显示用户点击的整行换行文本,无论他们点击的位置如何。
但是,此文本将包含标记段落结尾的尾随 \n
字符。在将文本与数组进行比较之前,您需要删除它。用这两行替换上面代码的最后一行:
NSString *trimmedLine = [tappedLine stringByTrimmingCharactersInSet:
[NSCharacterSet newlineCharacterSet]];
NSInteger indexOfTheObject = [myArray indexOfObject: trimmedLine];
我在文本视图中显示由 \n
或换行符分隔的字符串数组。感谢 \n
,如果文本视图中有空间,每个字符串都有自己的行。但是,如果 textview 的宽度小于字符串,则 textview 会自动换行到下一行,这样字符串实际上占两行。到目前为止没有任何问题。
但是,如果有人触摸它,我想抓住它。如果字符串适合一行,它就可以正常工作。但是,如果字符串已被 textview 分成两行,如果用户触摸了第一行,我需要附加下面的行以获取整个字符串。或者如果用户触及底线,我需要获取并添加前一个以获得整个字符串。
任何人都可以建议正确的方法吗?
这是我的代码,它抓取了人触摸的线,但是,当它试图计算数组中字符串的索引时,它只得到触摸的线并且失败了。
感谢任何建议:
- (void) handleTap:(UITapGestureRecognizer *)recognizer{
UITextView *textView = (UITextView *)recognizer.view;
CGPoint location = [recognizer locationInView:textView];
CGPoint position = CGPointMake(location.x, location.y);
UITextPosition *tapPosition = [textView closestPositionToPoint:position];
UITextRange *textRange = [textView.tokenizer rangeEnclosingPosition:tapPosition withGranularity:UITextGranularityLine inDirection:UITextLayoutDirectionRight];
//In following line, I am not getting the full text in the string, only the text of that line. I need to get the whole string.
NSString *tappedLine = [textView textInRange:textRange];
NSArray* myArray = [self.listSub.text componentsSeparatedByString:@"\n"];
NSInteger indexOfTheObject = [myArray indexOfObject: tappedLine];
//If the tapped line is not the same thing as the string, the above index becomes huge number like 94959494994949494 ie an error, not the index I want.
}
您可能想研究使用 UITableView https://developer.apple.com/documentation/uikit/uitableview
您可以为数组中的每个条目创建一个带有文本视图的单元格,当用户与任何单元格交互时您将收到委托调用
这确实是可以的。
首先,您需要将粒度更改为UITextGranularityParagraph
:
UITextRange *textRange = [textView.tokenizer rangeEnclosingPosition:tapPosition withGranularity:UITextGranularityParagraph inDirection:UITextLayoutDirectionRight];
这将 return 显示用户点击的整行换行文本,无论他们点击的位置如何。
但是,此文本将包含标记段落结尾的尾随 \n
字符。在将文本与数组进行比较之前,您需要删除它。用这两行替换上面代码的最后一行:
NSString *trimmedLine = [tappedLine stringByTrimmingCharactersInSet:
[NSCharacterSet newlineCharacterSet]];
NSInteger indexOfTheObject = [myArray indexOfObject: trimmedLine];