在数组中查找文本并返回索引号

时间:2018-03-07 00:35:00

标签: ios objective-c nsarray uitextview

我正在显示由\n分隔的字符串数组或textview中的换行符。感谢\n,如果textview中有空间,则每个字符串都有自己的行。但是,如果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.
    }

2 个答案:

答案 0 :(得分:1)

这确实是可能的。

首先,您需要将粒度更改为UITextGranularityParagraph

UITextRange *textRange = [textView.tokenizer rangeEnclosingPosition:tapPosition withGranularity:UITextGranularityParagraph inDirection:UITextLayoutDirectionRight];

这将返回用户点击的整个文本行,无论他们在哪里点击它。

但是,此文本将包含标记段落结尾的尾随\n字符。在将文本与数组进行比较之前,您需要删除它。用以下两行替换上面代码的最后一行:

NSString *trimmedLine = [tappedLine stringByTrimmingCharactersInSet:
                              [NSCharacterSet newlineCharacterSet]];
NSInteger indexOfTheObject = [myArray indexOfObject: trimmedLine];

答案 1 :(得分:0)

您可能希望了解如何使用UITableView https://developer.apple.com/documentation/uikit/uitableview

您可以为数组中的每个条目创建一个带有文本视图的单元格,当用户与任何单元格交互时,您将获得委托调用