iOS 实现类似通讯录按拼音排序 - PinYin4Objc

项目中需要实现类似通讯录那样按拼音进行排序以及索引列表的显示的功能,我这里使用了 PinYin4Objc 这个库来实现此功能。

PinYinObjc是一个效率很高的汉字转拼音类库,智齿简体和繁体中文,有如下特点:

1.效率高,使用数据缓存,第一次初始化以后,拼音数据存入文件缓存和内存缓存,后面转换效率大大提高; 2.支持自定义格式化,拼音大小写等等; 3.拼音数据完整,支持中文简体和繁体,与网络上流行的相关项目比,数据很全,几乎没有出现转换错误的问题.

下载 PinYinObjc

项目中的实际应用

项目需求:

显示一个班级的成员列表,有一个是管理员要排在最上面,下面按照拼音排序实现索引列表,效果图如下:

代码实现过程

查询数据库获取成员列表

1 //成员列表根据 isAdmin 字段进行排序查询——order by isAdmin
2 NSMutableArray *members = [[ASMemberDao sharedInstance] queryAllMembersByGroupId:groupId];
3 //根据排序查询结果第一个为管理员
4 ASContact *memeberAdmin = [members objectAtIndex:0];

将每个成员的名字转化成拼音

 1 //初始化HanyuPinyinOutputFormat对象,设置相应的 type
 2 HanyuPinyinOutputFormat *outputFormat=[[HanyuPinyinOutputFormat alloc] init];
 3 [outputFormat setToneType:ToneTypeWithoutTone];
 4 [outputFormat setVCharType:VCharTypeWithV];
 5 [outputFormat setCaseType:CaseTypeUppercase];
 6 //遍历成员列表,将成员名字 contactName 转成拼音,并存放到 categoryName 字段中,用于排序
 7 [members enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
 8     ASContact *contact = (ASContact *)obj;
 9     NSString *outputPinyin=[PinyinHelper toHanyuPinyinStringWithNSString:contact.contactName withHanyuPinyinOutputFormat:outputFormat withNSString:@""];
10     contact.categoryName = [outputPinyin uppercaseString];
11 }];
12 [outputFormat release];

将成员列表按照拼音字段 categoryName进行排序

1 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"categoryName" ascending:YES];
2 NSArray *array = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
3 [members sortUsingDescriptors:array];
4 [array release];
5 [sortDescriptor release];

定义一个全局变量 dataDictionary 来组织数据结构

key: 将汉字转完拼音后的第一个字母, 也就是上图 section 中的 A、B、C...

value: 是一个成员数组,存放每个 section 下的成员列表

如上图: A 是字典的一个 Key, 对应的 value 就是成员数组 {af1, af10},当然数组中存放的是成员对象。

 1 dataDictionary = [[NSMutableDictionary alloc] init];
 2 //存放每个 section 下的成员数组
 3 NSMutableArray *currentArray = nil;
 4 //用于获取拼音中第一个字母
 5 NSRange aRange = NSMakeRange(0, 1);
 6 NSString *firstLetter = nil;
 7 //遍历成员列表组织数据结构
 8 for (ASContact *contact in members) {
 9     //如果是管理员,则暂时不放如 dataDictionary 中
10     if (contact.isAdmin == 1) {
11          continue;
12     }
13     //获取拼音中第一个字母,如果已经存在则直接将该成员加入到当前的成员数组中,如果不存在,创建成员数据,添加一个 key-value 结构到 dataDictionary 中
14     firstLetter = [contact.categoryName substringWithRange:aRange];
15     if ([dataDictionary objectForKey:firstLetter] == nil) {
16         currentArray = [NSMutableArray array];
17         [dataDictionary setObject:currentArray forKey:firstLetter];
18     }
19     [currentArray addObject:contact];
20 }

在定义一个全局变量 allKeys 用于显示索引列表中索引

1 //取出 dataDictionary 中的 key 并进行排序
2 allKeys = [[NSMutableArray alloc] initWithArray:[[dataDictionary allKeys] sortedArrayUsingFunction:sortObjectsByKey context:NULL]];
3 //然后将管理员加入到排好序 allKeys 的最前面
4 [allKeys insertObject:@"管理员" atIndex:0];
5 [dataDictionary setObject:[NSArray arrayWithObjects:contactAdmin, nil] forKey:@"管理员"];

最后就是通过 allKeys 和 dataDictionary 进行配置一下 tableview 的各个代理就 OK 了,这里不在赘述

希望对阅读本文的你有帮助

时间: 2024-10-06 05:03:01

iOS 实现类似通讯录按拼音排序 - PinYin4Objc的相关文章

ios 汉字字符串数组拼音排序

ios没有提供简单的汉字拼音排序方法,在网上看到了oc方法,这里写以下对应的swift方法 var stringCompareBlock: (String,String)->Bool = { (str1:String, str2:String) -> Bool in var nsStr1 = str1 as NSString var nsStr2 = str2 as NSString var encode:NSStringEncoding = CFStringConvertEncodingTo

iOS开发之--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook功能开发汇总

前言 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: 目录 系统应用 系统服务 2.1. 短信与邮件 2.2. 通讯录 2.3. 蓝牙 2.4. 社交 2.5. Game Center 2.6. 应用内购买 2.7. iCloud 2.8. Passbook 1. 系统应用 在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览

iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: 调用系统应用 使用系统服务 短信与邮件 通讯录 蓝牙 社交 Game Center 应用内购买 iCloud Passbook 系统应用 在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,此时你可以直接使用UIApplication的OpenUR

iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开

--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务:http://www.jinhusns.com/Products/Download/?type=xcj 调用系统应用 使用系统服务 短信与邮件 通讯录 蓝牙 社交 Game Center 应用内购买 iCloud Passbook 目 录 系统应用 在开发某些应用时可能希望能

iOS开发长文--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

链接:http://www.cocoachina.com/ios/20150129/11068.html iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: 调用系统应用 使用系统服务 短信与邮件 通讯录 蓝牙 社交 Game Center 应用内购买 iCloud Passbook 系统应用 在开发某些应用时可能希望能够调用iOS系统内置的电话.

js中文汉字按拼音排序

代码1,拼音排序: var array = ['武汉', '北京', '上海', '天津']; array = array.sort( function compareFunction(param1, param2) { return param1.localeCompare(param2); } ); console.log(resultValue); array结果为:[ '北京' , '上海' , '天津' ,'武汉' ] ; 代码2,拼音排序并按字母分类: function pySegS

ecshop添加商品选择品牌时如何按拼音排序

ECSHOP后台添加新商品时,有一个选择品牌的下拉框,如果品牌太多,在下拉框里查找起来很不方便. 我想给“下拉框里的品牌列表”按品牌名的拼音排序,比如有“中国水利出版社” “中国人民出版社” 这两个品牌名的拼音首字母都是 “Z”,这样的品牌放在一起,这样方便查找, 请问以上需求要如何修改ECSHOP模板来实现呢?? 教程: 首先,这个问题,只修改ECSHOP模板是不行的,得通过修改程序来实现 下面是修改方法: 1) 如果你的ECSHOP数据库使用的是GBK字符集,那么很简单 打开 /includ

mysql根据汉字拼音排序查询

例如现在有一张数据表label,字段为id.name,此表的字符集设置为gb2312,以gb2312_chinese_ci整理. 设置InnoDB引擎的字符集也为简体中文,且整理为gb2312_chinese_ci. 查询语句如下: select * from label order_by name collate gb2312_chinese_ci; 效果如下: tip:有时候结果不是很准确,不知道是不是因为字符集选择的不当导致的,知道的朋友,请解答下,谢谢! mysql根据汉字拼音排序查询,

[转]Java汉字按照拼音排序

最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较. @Test public void test_sort_pinyin() { Collator cmp = Collator.getInstance(java.util.Locale.CHINA); String[] arr = { "张三", "李四", "王五", "赵六", "JAVA", "123", &q