項目中需要實現類似通訊錄那樣按拼音進行排序以及索引列表的顯示的功能,我這里使用了 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 了,這里不在贅述
希望對閱讀本文的你有幫助