美文网首页
关于搜索的一个问题

关于搜索的一个问题

作者: 0o冻僵的企鹅o0 | 来源:发表于2017-11-23 17:14 被阅读35次

    在项目中做搜索会碰到这样一个问题:你输入字母e,会模糊搜索出很多结果,比如“enter”,“empty”等,里面包含字母e,我们很容易就可以实现高亮字母e,但是结果中如果有中文,比如“这”,“者”,他们的拼音也包含字母e,那么怎么做到高亮结果呢?

    方法如下(比如输入了搜索字符searchText : e, 其中一个结果是:“到这里来”):

    1. 首先将搜索字符searchText转拼音(因为输入的可能是中文,这里统一将结果转为大写的拼音字母来判断,不单独判断),
    2. 将查询的结果进行遍历,取出查询结果的每个字符,取出“到”;
    3. 将“到”转为拼音“DAO”,判断“DAO”是否包含搜索字符searchText,如果包含,那么“到”高亮,否则不用高亮;或者搜索字符包含了“DAO”,也高亮,否则不高亮(这里看是否有这个需求)
      3.将所有判断的结果都依次组装到一个可变富文本字符串retStr中;

    代码如下:

    /**
     @param orgText 搜索得到的结果
     @param searchText 搜索输入的问题本
     @param font 字体大小
     @param orgColor 默认字体颜色
     @param highColor 高亮字体颜色
     @return 可变字符串
     */
    - (NSAttributedString *)generalSearchHighColorTextWithText:(NSString *)orgText
                                                    searchText:(NSString *)searchText
                                                          font:(UIFont *)font
                                                  orgTextColor:(UIColor *)orgColor
                                                     highColor:(UIColor *)highColor
    {
        NSMutableAttributedString *retStr = [[NSMutableAttributedString alloc] init];
        NSString *nameItem = nil;
        NSString *nameItemPinYi = nil;
        NSAttributedString *nameItemAStr = nil;
        
        UIColor *retColor = nil;
       NSString *searchT = [searchText fullSpellPinYinName];//fullSpellPinYinName 为中文转拼音的分类方法
        for (NSInteger i = 0; i < orgText.length; ++i)
        {
            nameItem = [orgText substringWithRange:NSMakeRange(i, 1)];
            nameItemPinYi = [nameItem fullSpellPinYinName];
            if (nameItemPinYi.length > 0)
            {
                if (nameItemPinYi.length >= searchT.length)
                {
                    if ([nameItemPinYi containsString:searchT])
                    {
                        retColor = highColor;
                    }
                    else
                    {
                        retColor = orgColor;
                    }
                }
                else
                {
                    if ([searchT containsString:nameItemPinYi]){
                        retColor = highColor;
                    }
                    else
                    {
                        retColor = orgColor;
                    }
                }
            }
            else
            {
                retColor = orgColor;
            }
            //genaralAttributeStringWith 是用文字,字体,颜色生成富文本的分类方法
            nameItemAStr = [UILabel genaralAttributeStringWith:nameItem font:font color:retColor];
            [retStr appendAttributedString:nameItemAStr];
        }
        
        return retStr;
    }
    

    总的来说,这里就是讨论中文结果的拼音中含有输入的字符串,该如何高亮这个中文文本。

    相关文章

      网友评论

          本文标题:关于搜索的一个问题

          本文链接:https://www.haomeiwen.com/subject/ugnzvxtx.html