iOS拼音搜索,拼音首字母搜索

扩展了一下 搜索框,能够实现拼音和首字母模糊搜索
基本搜索 [上一篇文章 ](https://www.cnblogs.com/wjw-blog/p/10724043.html iOS8之后搜索框的常规实例)

#import "NSString+utility.h"

@interface WJWPinyinSearchViewController ()<UISearchResultsUpdating,UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate>

@property (nonatomic, strong) UITableViewController *searchTableViewController;
@property (nonatomic, strong) UISearchController *searchController;
@property (nonatomic, strong) NSMutableArray *dataArray;
@property (nonatomic, strong) NSMutableArray *searchList;

@end

@implementation WJWPinyinSearchViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];

    [self addChildViewController:self.searchTableViewController];
    [self initDataArray];
    [self configUI];
}

- (void)initDataArray{
    [self.dataArray addObject:@"世界"];
    [self.dataArray addObject:@"核平"];
    [self.dataArray addObject:@"平行"];
    [self.dataArray addObject:@"宇宙"];
    [self.dataArray addObject:@"技术进步"];
    [self.dataArray addObject:@"毫无意义"];
    [self.dataArray addObject:@"尘归尘,土归土"];
    [self.dataArray addObject:@"中"];
    [self.dataArray addObject:@"国"];
    [self.dataArray addObject:@"红"];

}

- (void)configUI {

    [self.view addSubview: self.searchTableViewController.tableView];
    self.searchTableViewController.tableView.frame = self.view.frame;
}

#pragma mark ---UITableViewDataSource---
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (self.searchController.active) {
        return [self.searchList count];
    }else {
        return self.dataArray.count;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *searchCellId = @"SearchCellID";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:searchCellId];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:searchCellId];
    }
    if (self.searchController.active) {
        [cell.textLabel setText:self.searchList[indexPath.row]];
    }else {
        [cell.textLabel setText:self.dataArray[indexPath.row]];
    }
    return cell;
}

#pragma mark ----UISearchResultsUpdating----

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
    NSString *searchString = [self.searchController.searchBar text];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", searchString];
    if (self.searchList != nil) {
        [self.searchList removeAllObjects];
    }
    //过滤数据
    self.searchList = [NSMutableArray arrayWithArray:[_dataArray filteredArrayUsingPredicate:predicate]];
    //刷新表格
    [self.searchTableViewController.tableView reloadData];
}

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    NSLog(@"输入字符串为:%@ -- %lu", searchText, (unsigned long)searchText.length);
    //需要事先清空存放搜索结果的数组
    [self.searchList removeAllObjects];

    //在子线程中做搜索操作
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    dispatch_async(globalQueue, ^{
        if (searchText != nil && searchText.length > 0) {
            for (NSString *tempStr in self.dataArray) {
                NSString *pinyin = [tempStr transformToPinyin:tempStr];
                NSLog(@"字符拼音:%@",pinyin);
                if ([pinyin rangeOfString:searchText options:NSCaseInsensitiveSearch].length > 0) {
                    [self.searchList addObject:tempStr];
                }
            }
        }else {
            self.searchList = [NSMutableArray arrayWithArray:self.dataArray];
        }
        //回到主线程刷新表格
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.searchTableViewController.tableView reloadData];
        });
    });
}

-(UISearchController *)searchController {
    if (!_searchController) {
        _searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
        _searchController.searchResultsUpdater = self;
        _searchController.dimsBackgroundDuringPresentation = NO;
        _searchController.hidesNavigationBarDuringPresentation = YES;//搜索框编辑时隐藏导航栏
        _searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x, _searchController.searchBar.frame.origin.y, _searchController.searchBar.frame.size.width, 44.0);
        self.searchTableViewController.tableView.tableHeaderView = _searchController.searchBar;
        _searchController.searchBar.delegate = self;
    }
    return _searchController;
}

- (NSMutableArray *)dataArray {
    if (!_dataArray) {
        _dataArray = [NSMutableArray array];
    }
    return _dataArray;
}

- (UITableViewController *)searchTableViewController {
    if (!_searchTableViewController) {
        _searchTableViewController = [[UITableViewController alloc] init];
        _searchTableViewController.tableView.delegate = self;
        _searchTableViewController.tableView.dataSource = self;
    }
    return _searchTableViewController;
}

/*
 #pragma mark - Navigation

 // In a storyboard-based application, you will often want to do a little preparation before navigation
 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
 // Get the new view controller using [segue destinationViewController].
 // Pass the selected object to the new view controller.
 }
 */

@end

"NSString+utility.h" 中有一个方法用来将字符转为拼音字符串

/**
 把汉字字符串转为拼音

 @param aString 汉字字符串
 @return 拼音字符串
 */
- (NSString *)transformToPinyin:(NSString *)aString
{
    //转成了可变字符串
    NSMutableString *str = [NSMutableString stringWithString:aString];
    CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);

    //再转换为不带声调的拼音
    CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
    NSArray *pinyinArray = [str componentsSeparatedByString:@" "];
    NSMutableString *allString = [NSMutableString new];

    int count = 0;

    for (int  i = 0; i < pinyinArray.count; i++)
    {
        for(int i = 0; i < pinyinArray.count;i++)
        {
            if (i == count) {
                [allString appendString:@"#"];
                //区分第几个字母
            }
            [allString appendFormat:@"%@",pinyinArray[i]];
        }
        [allString appendString:@","];
        count ++;
    }
    NSMutableString *initialStr = [NSMutableString new];
    //拼音首字母
    for (NSString *s in pinyinArray)
    {
        if (s.length > 0)
        {
            [initialStr appendString:  [s substringToIndex:1]];
        }
    }
    [allString appendFormat:@"#%@",initialStr];
    [allString appendFormat:@",#%@",aString];
    return allString;
}

原文地址:https://www.cnblogs.com/wjw-blog/p/10724845.html

时间: 2024-10-29 13:52:50

iOS拼音搜索,拼音首字母搜索的相关文章

C#汉字转拼音(npinyin)将中文转换成拼音全文或首字母

汉字转拼音貌似一直是C#开发的一个难题,无论什么方案都有一定的bug,之前使用了两种方案. 1.Chinese2Spell.cs 一些不能识别的汉字全部转为Z 2.Microsoft Visual Studio International Feature Pack 1.0  连"广".“区”都不能转,很让人失望. 这些都是2010年以前的方案,至少还有大侠在为汉字转拼音不断努力着,目前发现最完美的就是NPINYIN,在googlecode可以看到它的开源项目,http://code.g

在数据库中将中文转换为拼音或者汉字首字母 转

sql数据库自定义一个函数把下面代码写进去 功能是得到汉字拼音首字母 如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 create function fun_getPY(@str nvarchar(4000)) returns nvarchar(4000) as begin declare @word n

java汉字转拼音以及得到首字母通用方法

1. [代码]PingYinUtil    package oa.common.utils; import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;import net.sourceforge.pinyin4j.form

【Solr】 solr对拼音搜索和拼音首字母搜索的支持

问:对于拼音和拼音首字母的支持,当你在搜商品的时候,如果想输入拼音和拼音首字母就给出商品的信息,怎么办呢? 实现方式有2种,但是他们其实是对应的.  用lucene实现 1.建索引, 多建一个索引字段,即拼音和拼音首字母这2个字段.合并的一个字段.  (拼音和拼音首字母,可以通过pinyin4j.jar.将想要进行拼音搜索的字段进行拼音转换.) 2.对输入的参数判断是否是拼音,(可以通过将传人的值转换为 utf-8 形式,如果转换后的字符串长度大于原来的字符串的长度,那么就不是拼音.否则就进行拼

jQuery实现前端模糊匹配与首字母搜索

实现效果 源码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>搜索框测试Demo</title> <style> .searchDiv {width: 400px;height: 400px;margin: 150px auto;} .on {font-size: 12px;font-weight: 700;color: red;

Lucene + Pinyin4J 提供首字母搜索(——)

遇到一个集团需求,要求在地址查询时候提供拼音搜索,第一反应应该不难,不过实现过程中却一波三折. 1.第一步是讲字段首字母进行索引,具体可以使用Pinyin4j提供的方法完成. 2.原来系统用的lucene3.0,分词用的ikanalyzer3.2 ,不支持连续字母和数字的分词,网上搜索下 ikanalyzer5.2 可以支持,下载下来发现必须用1.7JDK,如此高的版本,实际上已经把采纳的可能枪毙了.然后进行测试,发现仍然不行.最后找到 WildcardQuery 查询:具体代码如下 Boole

pinyin.js 能把文字转化成拼音和提取首字母等操作的一个插件

var pinyin = (function (){ var Pinyin = function (ops){ this.initialize(ops); }, options = { checkPolyphone: false, charcase: 'default' }; Pinyin.fn = Pinyin.prototype = { init: function (ops){ this.options = extend(options, ops); }, initialize: func

按照首字母搜索功能(mysql数据库执行语句)

select *  from `dd` order by ELT(INTERVAL(CONV(HEX(left(CONVERT(num USING gbk),1)),16,10),0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1

(自创)城市组件,含拼音首字母搜索 基于angular的封装

啥都不说 先给思想 城市组件设计 1:四个集合: totalJson 总的json provinceJson 省份json cityJson 城市json countyJSon 区县json 输出的字符串: totalStr:形如 安徽-合肥-政务区 的字符串 cityAndCounStr:形如 合肥-政务区 的字符串 listContentJson:只含有城市的json 如:hf [ 合肥 海丰] 2:方法: Step1:所有的搜索转为对拼音的匹配 如:安/an  会匹配到 anhui  an