直接奔入主题,哈哈。
我们的城市数据是由服务器返回。格式就是大数组+小字典组合的json数据。如下示例:(此文档适用于这种数据格式,如果是其他数据格式自行稍做更改)
({code = 110000; name = "\U5317\U4eac\U5e02"; parent = 0;},
{ code = 120000;name = "\U5929\U6d25\U5e02";parent = 0;},
{ code = 130100; name = "\U77f3\U5bb6\U5e84\U5e02";parent = 130000; });
每个小字典包含三个参数,城市代码,城市名称,城市当前等级。当前要现实的效果只用到城市名称就可以了。
实现的效果如图
首先,先说一下实现原理和过程,如果在这一步能体会懂的可以尝试不看下面的代码(代码在最下面贴出)自己动手写一下。如果还有点思想模糊的可以先看一下代码,然后自己动手敲。如果一点也看不懂,那估计是我文笔有问题,哈哈。可以直接粘贴复制我的代码使用。
由于服务器返回的是没分组的数据,所以,我们想要实现上面的效果,需要将返回的城市数据按照A--Z分组。首先我们需要取到每个城市的汉子名称,然后转化成拼音,取到拼音的首字母,最后把所有城市的首字母和取到的拼音的首字母相比较,如果相同的则分到一组,分组后的格式大字典:key = 取到的首字母(string),value = 首字母相同的所有城市(array)比如 {A:@[@"安庆市",@"安阳市",@"阿克索市"]},大致的思路就是这样。
下面开始代码部分。我建立了一个model类取名 CityTempModel 来存放服务器返回的城市数据首先.h
#import
@interface CityTempModel : NSObject
@property (nonatomic, copy)NSString *code;
@property (nonatomic, copy)NSString *name;
@property (nonatomic, copy)NSString *parent;
@end然后.m
#import "CityTempModel.h"
@implementation CityTempModel
@end
然后在要显示城市分组的controller引入头文件,并且初始化一个数组, 一个大字典
/*用来存放分组的首字母 A --- Z*/@property (nonatomic, strong)NSMutableArray *GroupTempArray;
/*用来存放分组之后的数据*/@property (nonatomic, strong)NSMutableDictionary *cityDic;
_cityDic = [NSMutableDictionary dictionary];
/*初始化一个数组,用来存放每个首字母的(key)的value*/NSMutableArray *arr=nil;
/*_AllCityTempArray这个数组是服务器返回的所有城市的数组,根据个人情况更改 */ for (int i = 0; i < _AllCityTempArray.count; i++) {
/*取出每个model*/CityTempModel *model = _AllCityTempArray[i];
/*取每个城市的大写首字母,firstCharactor在下面*/NSString *T = [self firstCharactor:model.name];
/*判断最大的字典里所有的key是否包含当前取到的城市首字母,如果包含,则先取出对应key的数组value,把对应的值存放到对应的数组里,然后把这个数组重新赋值给这个key。如果不包含则吧对应的城市放到初始化的小数组中,然后新建一个键值对,把这个小数组赋值给这个key*/
if([[_cityDic allKeys] containsObject:T]){
arr=[_cityDic objectForKey:T];
[arr addObject:model.name];
[_cityDic setObject:arr forKey:T];
}else{
arr= [[NSMutableArray alloc]initWithObjects:model.name, nil];
[_cityDic setObject:arr forKey:T];
}
}
//汉子转拼音首字母
- (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];
}
到这一步就已经吧服务器返回的格式转化成{B:@[@"北京市",@"别来试"],L:@[@"辽宁市",@"丽水市",@"六安市"]},这种形式,我们接下来需要取出 这个字典的所有key进行 A----Z的排序
NSMutableArray *GroupTempArray= [NSMutableArray arrayWithArray:[[_cityDic allKeys] sortedArrayUsingSelector:@selector(compare:)]];
上面的GroupTempArray数组最好设置成全局属性。为了方便看一些,我这里就不设置了。以下代码默认为全局变量
返回分区的时候
#pragma mark UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.GroupTempArray.count;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSArray *Array = [self.cityDic objectForKey:self.GroupTempArray[section]];
return Array.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
/*代码请改成自己的,主要展示取值的代码,下面两行代码*/ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cityCell];
NSArray *Array = [self.cityDic objectForKey:self.GroupTempArray[indexPath.section]];
[cell.textLabel setText:Array[indexPath.row]];
return cell;
}
//快速索引
- (NSArray *) sectionIndexTitlesForTableView:(UITableView *)tableView
{
return self.GroupTempArray;
}
- (NSInteger) tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
return index;
}
就是这样了。