搜索NSString并使用省略号显示结果

时间:2014-03-01 00:52:02

标签: ios objective-c

我想在字符串中搜索搜索字词,并突出显示字符串中的所有匹配项。

应显示搜索字词周围的某些文字(介于...之间),搜索字词应采用粗体字体样式(NSMutableAttributedString)。

示例:搜索“text”

  

...示例文字 bla ...... ...更多文字 blabla ...... bla 文字 blabla ..

NSString *haystackString = [[self.searchResults objectAtIndex:indexPath.row] stripHTML];
NSString *needleString = self.searchDisplayController.searchBar.text;
if (!self.searchRegex) {
    self.searchRegex = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"(?:\\S+\\s)?\\S*%@\\S*(?:\\s\\S+)?", needleString] options:(NSRegularExpressionDotMatchesLineSeparators + NSRegularExpressionCaseInsensitive) error:nil];
}
NSArray *matches = [self.searchRegex matchesInString:haystackString options:kNilOptions range:NSMakeRange(0, haystackString.length)];
NSMutableString *tempString = [[NSMutableString alloc] init];
for (NSTextCheckingResult *match in matches) {
    [tempString appendString:@"..."];
    [tempString appendString:[haystackString substringWithRange:[match rangeAtIndex:0]]];
    [tempString appendString:@"..."];
}
if (tempString) {
    cell.textLabel.text = tempString;
}

我当前的代码似乎很慢,但还不支持NSMutableAttributedString。有更好的解决方案吗?谢谢!

2 个答案:

答案 0 :(得分:0)

要使用attributionString,只需像这样更改代码

// Create a reusable attributed string dots and matchStyle dictionary
NSAttributedString *dots = [[NSAttributedString alloc] initWithString:@"..."];
NSDictionary *matchStyle = @{ NSFontAttributeName : [UIFont boldSystemFontOfSize:12]};

NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] init];
for (NSTextCheckingResult *match in matches)
{
    NSString *matchString = [haystackString substringWithRange:[match rangeAtIndex:0]];

    [attributedText appendAttributedString:dots];
    [attributedText appendAttributedString:[[NSAttributedString alloc] initWithString:matchString attributes:matchStyle]];
    [attributedText appendAttributedString:dots];
}

if (attributedText.length > 0)
{
    cell.textLabel.attributedText = attributedText;
}

最佳, 的Sascha

答案 1 :(得分:0)

NSScanner可用作正则表达式的替代方法,以查找文本的位置。获得匹配的位置后,您可以提取前后部分并构建结果字符串。

使用这两种技术,您应该先处理字符串并构建结果集,然后再尝试在表中显示结果。这可确保滚动时不会进行任何实际处理。

如果之前无法执行此操作,请在后台线程上运行它并将结果推回到主线程以更新单元格(如果它仍然可见,请使用索引路径进行检查)。