iOS 列表城市按首字母分组,快速索引

2018-08-02  本文已影响0人  嗯嗯大葱

直接奔入主题,哈哈。

我们的城市数据是由服务器返回。格式就是大数组+小字典组合的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 <Foundation/Foundation.h>

@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;

}

就是这样了。

哈哈哈
上一篇下一篇

猜你喜欢

热点阅读