iOS 實現(xiàn)類似通訊錄按拼音排序 - PinYin4Objc

最近項目中需要實現(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)示逢净,如圖:

IMG_1862.PNG
代碼實現(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

菜鳥筆記挨务!希望對你有幫助!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玉组,一起剝皮案震驚了整個濱河市谎柄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惯雳,老刑警劉巖朝巫,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異石景,居然都是意外死亡劈猿,警方通過查閱死者的電腦和手機(jī)拙吉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揪荣,“玉大人筷黔,你說我怎么就攤上這事≌叹保” “怎么了必逆?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長揽乱。 經(jīng)常有香客問我虹菲,道長臼予,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任往产,我火速辦了婚禮陌粹,結(jié)果婚禮上撒犀,老公的妹妹穿的比我還像新娘。我一直安慰自己掏秩,他們只是感情好或舞,可當(dāng)我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒙幻,像睡著了一般映凳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邮破,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天诈豌,我揣著相機(jī)與錄音,去河邊找鬼抒和。 笑死矫渔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摧莽。 我是一名探鬼主播庙洼,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼镊辕!你這毒婦竟也來了油够?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤征懈,失蹤者是張志新(化名)和其女友劉穎叠聋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體受裹,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡碌补,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年虏束,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厦章。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡镇匀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袜啃,到底是詐尸還是另有隱情汗侵,我是刑警寧澤,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布群发,位于F島的核電站晰韵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏熟妓。R本人自食惡果不足惜雪猪,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望起愈。 院中可真熱鬧只恨,春花似錦、人聲如沸抬虽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阐污。三九已至休涤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笛辟,已是汗流浹背滑绒。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留隘膘,地道東北人疑故。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像弯菊,于是被迫代替她去往敵國和親纵势。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,606評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,834評論 25 707
  • 年少時管钳,我們都會默默的在心里喜歡過一人钦铁。也許你喜歡了一年,也許你喜歡了兩年才漆,也許你喜歡了很久很久牛曹。但當(dāng)你走...
    南天九茴閱讀 365評論 0 1
  • 有個人說過一句話“愛一個人黎比,骨子里無形中會泛濫騷氣” ...
    我孤獨我驕傲閱讀 154評論 0 0
  • 某醫(yī)院急診室超营。 救護(hù)車送來一個心臟病突然發(fā)作的病人。 病人被送進(jìn)去檢查病因后阅虫,家屬還在哭哭啼啼演闭。 尤其病人的母親,...
    周周飯飯閱讀 396評論 9 4