我正在使用iOS 8中引入的UISearchController API实现搜索。我有一个UITableViewController子类,既可以作为搜索结果控制器,也可以作为搜索结果更新程序。该控制器负责在表格视图中显示搜索结果。
每次searchBar中的文本发生更改时,搜索API都会在我的表视图控制器上调用UISearchControllerUpdating方法-updateSearchResultsForSearchController:
。在此方法中,我根据新的搜索字符串更新搜索结果,然后调用[self.tableview reloadData]
。
我还试图突出显示结果列表中搜索字符串的出现次数。我通过将表格视图单元格中的attributedText设置为包含高光的属性字符串来实现此目的。
我看到以下行为:
经过一些试验和错误,我发现这似乎与表视图或单元格没有任何关系,并且与UILabel有关。似乎第二次设置attributedText属性时标签总是松开高亮显示。我真的只能设置一次吗?
表视图数据源:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString* plainCell = @"plainCell";
UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:plainCell];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:plainCell];
}
JFDHelpEntry* entry = searchResults[indexPath.row];
cell.textLabel.attributedText = [self highlightedString:entry.title withSearchString:currentSearchString];
return cell;
}
生成文本的方法突出显示:
- (NSAttributedString*)highlightedString:(NSString*)string withSearchString:(NSString*)searchString
{
NSMutableAttributedString* result = [[NSMutableAttributedString alloc] initWithString:string];
NSArray* matchedRanges = [self rangesOfString:searchString inString:string];
for (NSValue* rangeInABox in matchedRanges) {
[result addAttribute:NSBackgroundColorAttributeName value:[UIColor yellowColor] range:[rangeInABox rangeValue]];
}
return result;
}
找到要突出显示范围的方法:
- (NSArray*)rangesOfString:(NSString*)needle inString:(NSString*)haystack
{
NSMutableArray* result = [NSMutableArray array];
NSRange searchRange = NSMakeRange(0, haystack.length);
NSRange foundRange;
while (foundRange.location != NSNotFound) {
foundRange = [haystack rangeOfString:needle options:NSCaseInsensitiveSearch range:searchRange];
if (foundRange.location != NSNotFound) {
[result addObject:[NSValue valueWithRange:foundRange]];
searchRange.location = foundRange.location + foundRange.length;
}
searchRange.length = haystack.length - searchRange.location;
}
return result;
}
有什么想法吗?谢谢!
答案 0 :(得分:0)
我现在确信我的问题是由UIKit中的一个错误造成的,我已经报道过了。你可以看到它on openradar。
解决方法是检查字符串的开头是否有高亮显示,如果没有,则添加0-1范围内的清晰背景颜色属性。