iOS中一种字符串关键字检索高亮的简易实现

栏目: IOS · 发布时间: 6年前

内容简介:原文链接:本文Demo地址:我的Demo集合:

原文链接: kukumalucn.github.io/blog/2018/1…

本文Demo地址: Demo ,喜欢请star

我的Demo集合: JXT_iOS_Demos ,喜欢请star

平时开发中,我们总会不时的和富文本打交道。有时,我们需要用富文本高亮某句话中的某个关键字,如果这个关键字只出现一次,或者说这句话比较短,用 - (NSRange)rangeOfString:(NSString *)searchString 这个方法就可以很容易的确定这些关键字的 range ,如果是固定的一句话,那甚至可以将 range 写成固定值。但是如果是一篇文章,就会相对棘手些。 这个问题其实很像是关键字检索高亮的问题,网上有很多相关的算法甚至三方库,比如 ICTextView ,下面提供一个十分简单的基于系统API的方法来解决这个问题,效果如下:

iOS中一种字符串关键字检索高亮的简易实现

Code

其实这个算法的核心就在于如何同时获取到字符串中重复出现的所有的子串的 range- (NSRange)rangeOfString:(NSString *)searchString 方法只能获取到第一次出现的子串的 range ,设置 NSStringCompareOptions ,可以改变获取到的结果,但是也只能获取到一个,不知道系统有没有提供直接的方法,笔者暂时是没有发现…… 简单的算法就是遍历,网上也有很多人提供了代码,但大部分都是多次遍历,效率肯定不会太好,经过调试和优化,笔者有了如下方法,通过几万字的字符串匹配验证,依旧可以保持在毫秒级,应该是可以适用于大部分简单的场景了,主要是算法相对于正则或者其他方式,简单易懂:

- (void)jxt_enumerateRangeOfString:(NSString *)searchString usingBlock:(void (^)(NSRange searchStringRange, NSUInteger idx, BOOL *stop))block
{
    if ([self isKindOfClass:[NSString class]] && self.length &&
        [searchString isKindOfClass:[NSString class]] && searchString.length) {
        NSArray <NSString *>*separatedArray = [self componentsSeparatedByString:searchString];
        if (separatedArray.count < 2) {
            return ;
        }
        NSUInteger count = separatedArray.count - 1; //少遍历一次,因为拆分之后,最后一部分是没用的
        NSUInteger length = searchString.length;
        __block NSUInteger location = 0;
        [separatedArray enumerateObjectsUsingBlock:^(NSString * _Nonnull componentString, NSUInteger idx, BOOL * _Nonnull stop) {
            if (idx == count) {
                *stop = YES;
            }
            else {
                location += componentString.length; //跳过待筛选串前面的串长度
                if (block) {
                    block(NSMakeRange(location, length), idx, stop);
                }
                location += length; //跳过待筛选串的长度
            }
        }];
    }
}
复制代码

具体使用如下:

[attributedString.string jxt_enumerateRangeOfString:searchString usingBlock:^(NSRange searchStringRange, NSUInteger idx, BOOL *stop) {
    [attributedString addAttributes:@{
                                      NSForegroundColorAttributeName:[UIColor redColor],
                                      NSBackgroundColorAttributeName:[[UIColor blueColor] colorWithAlphaComponent:0.2],
                                      } range:searchStringRange];
}];
复制代码

本文作者:霖溦

本文链接: kukumalucn.github.io/blog/2018/1…

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-ND 4.0 许可协议。转载请注明出处!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web2.0策略指南

Web2.0策略指南

艾米 / 2009-3 / 39.00元

《Web2.0策略指南》是有关战略的。书中的示例关注的是Web 2.0的效率,而不是聚焦于技术。你将了解到这样一个事实:创建Web 210业务或将Web 2.0战略整合到现在业务中,意味着创建一个吸引人们前来访问的在线站点,让人们愿意到这里来共享他们的思想、见闻和行动。当人们通过Web走到一起时,结果可能远远大于各部分的和。随着传统的“口碑传诵”助推站点高速成长,客户本身就能够帮助建立站点。 ......一起来看看 《Web2.0策略指南》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具