码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-02-12 17:53:01      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

项目中需要实现类似通讯录那样按拼音进行排序以及索引列表的显示的功能,我这里使用了 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];
View Code

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

技术分享
 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];
View Code

将成员列表按照拼音字段 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];
View Code

定义一个全局变量 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 }
View Code

在定义一个全局变量 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:@"管理员"];
View Code

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

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

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

标签:

原文地址:http://www.cnblogs.com/jerryfeng/p/4288244.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!