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

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

作者: 嗯嗯大葱 | 来源:发表于2018-08-02 10:35 被阅读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;

    }

    就是这样了。

    哈哈哈

    相关文章

      网友评论

          本文标题:iOS 列表城市按首字母分组,快速索引

          本文链接:https://www.haomeiwen.com/subject/aecjvftx.html