其中用到PinYin4Objc第三方 下载地址: https://github.com/kimziv/PinYin4Objc
项目中的实际应用
项目需求:
显示一个班级的成员列表,有一个是管理员要排在最上面,下面按照拼音排序实现索引列表,效果图如下:
代码实现过程
查询数据库获取成员列表
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
1 //成员列表根据 isAdmin 字段进行排序查询——order by isAdmin 2 NSMutableArray *members = [[ASMemberDao sharedInstance] queryAllMembersByGroupId:groupId]; 3 //根据排序查询结果第一个为管理员 4 ASContact *memeberAdmin = [members objectAtIndex:0];
将每个成员的名字转化成拼音
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
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进行排序
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
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},当然数组中存放的是成员对象。
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
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
用于显示索引列表中索引
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
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:@"管理员"];