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

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

内容简介:原文链接:本文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 许可协议。转载请注明出处!


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

查看所有标签

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

注意力商人

注意力商人

吳修銘 / 黃庭敏 / 天下雜誌 / 2018-4-2 / NT$650

電子郵件,免費!照片分享,無上限! 你是否想過,隨手可得的免費內容、便利的免費服務,到底都是誰在付費? 如果商品免費,那你就不是消費者,而是商品! 你我可能都不知不覺地把自己賣給了注意力商人! 「『媒體轉型、網路演化與資訊浪潮」此一主題最具洞見的作者。』──黃哲斌(資深媒體人) 「這是少有的關注產業發展的傳播史,對現在或未來的『注意力產業』」中人來說,不可不讀。」──......一起来看看 《注意力商人》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具