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 许可协议。转载请注明出处!


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

查看所有标签

猜你喜欢:

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

计算机程序设计艺术(第2卷)

计算机程序设计艺术(第2卷)

高德纳 / 机械工业出版社 / 2008-1 / 109.00元

《计算机程序设计艺术:半数值算法(第2卷)(英文版)(第3版)》主要内容:关于算法分析的这多卷论著已经长期被公认为经典计算机科学的定义性描述。迄今已出版的完整的三卷已经组成了程序设计理论和实践的惟一的珍贵资源,无数读者都赞扬Knuth的著作对个人的深远影响,科学家们为他的分析的美丽和优雅所惊叹,而从事实践的程序员已经成功地将他的“菜谱式”的解应用到日常问题上,所有人都由于Knuth在书中表现出的博......一起来看看 《计算机程序设计艺术(第2卷)》 这本书的介绍吧!

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

HTML 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具