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];
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 了,這里不在贅述

希望對閱讀本文的你有幫助


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM