最近項目中需要實現(xiàn)類似通訊錄那樣按拼音進(jìn)行排序以及索引列表的顯示的功能贫导,這里使用了 PinYin4Objc 這個庫來實現(xiàn)此功能懈万。
PinYinObjc是一個效率很高的漢字轉(zhuǎn)拼音類庫翩瓜,智齒簡體和繁體中文欺冀,有如下特點:
1希坚、效率高柴钻,使用數(shù)據(jù)緩存,第一次初始化以后,拼音數(shù)據(jù)存入文件緩存和內(nèi)存緩存采幌,后面轉(zhuǎn)換效率大大提高劲够;
2、支持自定義格式化休傍,拼音大小寫等等征绎;
3、拼音數(shù)據(jù)完整磨取,支持中文簡體和繁體人柿,與網(wǎng)絡(luò)上流行的相關(guān)項目比,數(shù)據(jù)很全忙厌,幾乎沒有出現(xiàn)轉(zhuǎn)換錯誤的問題.
在項目中使用可以cocoapods來管理:pod 'PinYin4Objc', '~> 1.1.1'
也可以直接去github上下載源碼:PinYinObjc
項目需求:
獲取一個銷售人員的列表凫岖,并且把自己放到第一個,用#標(biāo)示逢净,如圖:
代碼實現(xiàn)過程:
1哥放、獲取銷售人員列表數(shù)據(jù)(這里是通過網(wǎng)絡(luò)請求獲取):
///查詢列表數(shù)據(jù)
- (void)fetchSallersList {
[_listAPI startWithCompletionWithSuccess:^(id responseDataDict) {
[self.tableView.mj_header endRefreshing];
///解析數(shù)據(jù)
NSMutableArray *array = [SCSalesModel mj_objectArrayWithKeyValuesArray:responseDataDict];
self.resultList = [array mutableCopy];
///處理數(shù)據(jù)
[self conversionResultData];
[self changeResultList];
///刷新UI
[self reloadUI];
} failure:^(NSError *error) {
[self.tableView.mj_header endRefreshing];
[SCAlertHelper handleError:error];
}];
}
2、將每個銷售人員的名字轉(zhuǎn)成拼音并轉(zhuǎn)成大寫字母:
HanyuPinyinOutputFormat *outputFormat=[[HanyuPinyinOutputFormat alloc] init];
[outputFormat setToneType:ToneTypeWithoutTone];
[outputFormat setVCharType:VCharTypeWithV];
[outputFormat setCaseType:CaseTypeUppercase];
[self.resultList enumerateObjectsUsingBlock:^(SCSalesModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSString *pinyin = [[PinyinHelper toHanyuPinyinStringWithNSString:obj.salesName withHanyuPinyinOutputFormat:outputFormat withNSString:@""] uppercaseString];
SCLog(@"名字轉(zhuǎn)拼音大寫:%@", pinyin);
obj.pinyinName = pinyin;
}];
3爹土、按照拼音字段pinyinName進(jìn)行排序:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"pinyinName" ascending:YES];
NSArray *array = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[self.resultList sortUsingDescriptors:array];
4婶芭、定義一個全局變量 dataDictionary 來組織數(shù)據(jù)結(jié)構(gòu)
key: 將漢字轉(zhuǎn)完拼音后的第一個字母, 也就是上圖section中的 A、B着饥、C...
value: 是一個成員數(shù)組犀农,存放每個section下的成員列表
_dataDictionary = [[NSMutableDictionary alloc] init];
//存放每個 section 下的成員數(shù)組
NSMutableArray *currentArray = nil;
//用于獲取拼音中第一個字母
NSRange aRange = NSMakeRange(0, 1);
NSString *firstLetter = nil;
//遍歷成員列表組織數(shù)據(jù)結(jié)構(gòu)
for (SCSalesModel *seller in self.resultList) {
//如果是本人,則暫時不放如 dataDictionary 中
if ([seller.salesId isEqualToString:[SCUserModel currentLoggedInUser].userId]) {
_owerSaller = seller;
continue;
}
//獲取拼音中第一個字母宰掉,如果已經(jīng)存在則直接將該成員加入到當(dāng)前的成員數(shù)組中呵哨,如果不存在,創(chuàng)建成員數(shù)據(jù)轨奄,添加一個 key-value 結(jié)構(gòu)到 dataDictionary 中
firstLetter = [seller.pinyinName substringWithRange:aRange];
if ([_dataDictionary objectForKey:firstLetter] == nil) {
currentArray = [NSMutableArray array];
[_dataDictionary setObject:currentArray forKey:firstLetter];
}
[currentArray addObject:seller];
}
5孟害、再定義一個全局變量 allKeys 用于顯示索引列表中索引:
_allKeys = [[NSMutableArray alloc] initWithArray:[[_dataDictionary allKeys] sortedArrayUsingFunction:sortObjectsByKey context:NULL]];
//然后將本人加入到排好序 allKeys 的最前面
if (_owerSaller) {
[_allKeys insertObject:@"#" atIndex:0];
[_dataDictionary setObject:[NSArray arrayWithObjects:_owerSaller, nil] forKey:@"#"];
}
//其中sortObjectsByKey是排序方法
NSInteger sortObjectsByKey(id user1, id user2, void *context) {
NSString *u1,*u2;
//類型轉(zhuǎn)換
u1 = (NSString*)user1;
u2 = (NSString*)user2;
return [u1 localizedCompare:u2];
}
6、最后就是通過 allKeys 和 dataDictionary 進(jìn)行配置一下 tableview 的各個代理就 OK 了挪拟。
借鑒:http://www.cnblogs.com/jerryfeng/p/4288244.html
菜鳥筆記挨务!希望對你有幫助!