最近公司应要求写一个搜索功能,要求实现搜索结果中把搜索词批量标红处理,整了半天,后又断断续续的改进了一下
以下是具体实现:
#import <Foundation/Foundation.h>
@interface TiSearch : NSObject
+(NSMutableAttributedString *)getRedStringWith:(NSArray *)array andString:(NSString *)str;
@end
#import "TiSearch.h"
@implementation TiSearch
/**
* 返回个别标红的字符串
*
* @param array 要标红的文字数组
* @param str 整段文本
*
*/
+(NSMutableAttributedString *)getRedStringWith:(NSArray *)array andString:(NSString *)str{
NSString * allString = str;
NSMutableAttributedString *attStr =
[[NSMutableAttributedString alloc] initWithString:str];
// 设置高亮颜色
UIColor *color = [UIColor redColor];
for (int i = 0 ; i < array.count; i ++) {
//每次for循环都会对字符串进行截取,所以要保证for循环开始时字符串的完整性
str = allString;
NSString * oneString = array[i];
NSRange range = [str rangeOfString:oneString];
while(range.location!= NSNotFound ) {
[attStr addAttribute:NSForegroundColorAttributeName
value:color
range:NSMakeRange(range.location+[allString rangeOfString:str].location, range.length)];
str = [str substringFromIndex:range.location + range.length];
range = [str rangeOfString:oneString];
}
}
return attStr;
}
返回的是一个已经标红的字符串,对应label的AttributedText 属性, 可以直接赋值过去
有一点小BUG,更正一下代码,如下
/**
* 返回个别标红的字符串
*
* @param array 要标红的文字数组
* @param str 整段文本
*
*/
+(NSMutableAttributedString *)getRedStringWith:(NSArray *)array andString:(NSString *)str{
NSString * allString = str;
NSMutableAttributedString *attStr =
[[NSMutableAttributedString alloc] initWithString:str];
// 设置高亮颜色
UIColor *color = [UIColor redColor];
for (int i = 0 ; i < array.count; i ++) {
str = allString;
NSString * oneString = array[i];
NSRange range = [str rangeOfString:oneString];
while(range.location!= NSNotFound ) {
[attStr addAttribute:NSForegroundColorAttributeName
value:color
range:NSMakeRange(range.location+[allString rangeOfString:str].location, range.length)];
str = [str substringFromIndex:range.location + range.length];
range = [str rangeOfString:oneString];
}
}
return attStr;
}
转载请注明出处,谢谢