城市列表排序
?
要實現如圖效果的選擇界面,我們應該怎么做呢?
首先我們有一個城市數據列表,假設是無序的,那么我們首先要對其進行排序。
假設我們從服務器獲取到數據,并將其存在一個數組中,數組中每一個地址都是一個CCCityModel,該model包含了地址相關信息。以下是排序處理:
//將服務器獲取到的citiesArray數組進行分組排序- (NSMutableArray *)convertAToZArray:(NSMutableArray *)citiesArray{//用來存放分組之后的數據NSMutableDictionary *cityDic = [NSMutableDictionary dictionary];//按首字母分組,存放在cityDic中for (int i = 0; i < [citiesArray count]; i++) {CCCityModel *cityModel = citiesArray[i];//firstCharactor方法在下邊,是將城市的第一個字母取出NSString *firstChar? = [self firstCharactor:cityModel.name];/*判斷最大的字典里所有的key是否包含當前取到的城市首字母,如果包含,則先取出對應key的數組value, 把新的值存放到對應的數組里,然后把這個數組重新賦值給這個key,完成添加。如果不包含則吧對應的 城市放到初始化的小數組中,然后新建一個鍵值對,把這個小數組賦值給這個key*/ NSMutableArray *groupArray = nil;if([[cityDic allKeys] containsObject:firstChar]){groupArray = [cityDic objectForKey:firstChar];[groupArray addObject:cityModel];[cityDic setObject:groupArray forKey:firstChar];}else{groupArray = [[NSMutableArray alloc] initWithObjects:cityModel, nil];[cityDic setObject:groupArray forKey:firstChar];}} //此時cityDic中已經將所有城市按照首字母分組好了//所有包含的首字母按照A-Z排序NSMutableArray *allCityFirstCharArray = [NSMutableArray arrayWithArray:[[cityDic allKeys] sortedArrayUsingSelector:@selector(compare:)]];//按照A-Z的順序重組數據,對分組的城市進行排序, allCityArray存放最終數據NSMutableArray *allCityArray = [NSMutableArray array];for (int i = 0; i < [allCityFirstCharArray count]; i++) {//取出對應字母分組的數組NSMutableArray *groupArray = [cityDic objectForKey:allCityFirstCharArray[i]];//對其按照A-Z的順序排序, nickNameSort為排序方法NSArray *sortArr = [ccArray sortedArrayUsingFunction:nickNameSort context:NULL];//存放首字母以及對應排序后的城市NSDictionary *dic = [NSDictionary dictionaryWithObject:sortArr forKey:allCityFirstCharArray[i]];//加入最終數組[allCityArray addObject:dic];}return allCityArray; }//若第一個字的第一個字母相同,則按第一個字的第二個字母比較,若第一個字的字母完全相同,按第二個字的首字母繼續排序,依此類推,也可以根據自己的業務需求定制更復雜的比較邏輯 NSInteger nickNameSort(id cityFitst, id citySecond, void *context){//類型轉換CCCityModel *cityF = (CCCityModel *)cityFitst;CCCityModel *cityS = (CCCityModel *)citySecond;return? [cityF.name localizedCompare:cityS.name]; }//獲取漢字首字母 - (NSString *)firstCharactor:(NSString *)aString{//轉成了可變字符串NSMutableString *str = [NSMutableString stringWithString:aString];//先轉換為帶聲調的拼音CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);//再轉換為不帶聲調的拼音CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);//轉化為大寫拼音NSString *pinYin = [str capitalizedString];//獲取并返回首字母return [pinYin substringToIndex:1];}通過以上方法得到一個按字母分組排序后的數組作為tableview的數據源,然后實現tableview的相關方法展示到界面上即可,這里已經沒有什么難度就不再敘說。
然后是右側索引的創建,這里使用的是DSectionIndexView,也很簡單,可參考https://www.jianshu.com/p/d4213ea7e058。
最后是上邊搜索功能,我這里是將從服務器獲取的未分組排序的數組緩存了,搜索都是操作的該數組生成新的數據源然后刷新tableview。
https://www.jianshu.com/p/69ff8ed1857f多音字處理方法
總結
- 上一篇: 【转载】应聘总经理的答卷,供大家打分
- 下一篇: 机械硬盘与固态硬盘的区别