美文网首页
iOS - 联系人列表分组排序(2016-07-07)

iOS - 联系人列表分组排序(2016-07-07)

作者: 欧币杰昔 | 来源:发表于2016-07-07 13:17 被阅读377次

    对联系人列表进行排序

    步骤:

    1、将26个字母保存为一个数组 + 再保存为一个以每个字母为key的字典

    //获取26个字母
    for (char ch ='a'; ch<='z'; ch++)
    {
    //添加到key的数组
    NSString *key =[NSString stringWithFormat:@"%c",ch];
    //添加到数组
    [self.mArrkeys  addObject:key];
            
    //创建可变的数组
    NSMutableArray *mArr =[NSMutableArray new];
    //把26个字母作为键值 添加可变数组对象到可变字典中
    [self.mDic setObject:mArr forKey:key];
    }
    

    此时考虑到排序的数据开头字母可能为非a~z,多加一个“#”来存放其他的数据

    NSMutableArray *mArr =[NSMutableArray new];
    NSString *jing = @"#";
    [self.mArrkeys  addObject:jing];
    [self.mDic setObject:mArr forKey:jing];
    

    此时有拥有 :

    1、一个数组:a~z 加“#”共27个元素;

    2、一个字典:a~z 加“#”共27个元素,元素为key,每一个key还没有值。

    2、循环将需要排序的数据值,以首字母作为键值,添加到字典中对应的元素(可变字典)

    for (Dynamic_DetailXmlMoDel *cityName in arrData)
    {
    char index;
            
    char tou = [[cityName.name substringToIndex:1]characterAtIndex:0];
    NSLog(@"%c",tou);
    if ( tou >='a' & tou <='z')//小写字母开头
    {
    index = tou;
    }
    else if (tou >='A' & tou <='Z')//大写字母开头,当做小写字母来进行排序
    {
    index = tou+32;
    }
    else//中文开头
    {
    //获取城市名称的首字母 进行分类
    index = pinyinFirstLetter(([cityName.name characterAtIndex:0]));
    }
    //把首字母转对象
    NSString *indexKey =[NSString stringWithFormat:@"%c",index];
    
    //根据key值获取字典中的可变数组
    NSMutableArray *mArr =self.mDic [indexKey];//dic[@"key"]  @"key" =indexKey
         
    //添加城市
    [mArr addObject:cityName];
    }
    

    这里需要区分字母开头和中文开头,并且将大写字母开头的当做小写字母来处理(因为所拥有的key只有小写字母),这样子同一个字母开头的,不管大写小写,都会在一个分组下

    3、将字典中没有值的元素删除,并且删除数组中对应这个key的元素

    //判断没有城市的分类要删除
    for (NSString *key in self.mDic.allKeys)
    {
    //获取key下的数组
    NSMutableArray *mArrCity =self.mDic[key];
    //判断个数小于1是空的
    if (mArrCity.count<1)
    {
    //数组
    [self.mArrkeys removeObject:key];
    //字典
    [self.mDic removeObjectForKey:key];
    //跳过
    continue;
    }
    }
    

    4、OK,现在已经排序好数据

    接下来就是显示数据
    1、以数组的元素个数返回TableView的组数,元素内容就是组头的内容;
    2、以字典中各个元素的值(可变数组)的个数返回每个分组的行数,并根据行数
    indexPath.row设置对应的内容。

    5、最后加个索引

    //设置右侧的索引
    -(NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView
    {
    self.sectionIndexBackgroundColor = [UIColor clearColor];
    self.sectionIndexColor = COLOR_STYLE;
    return self.mArrkeys;
    }
    

    最终效果:

    Paste_Image.png

    相关文章

      网友评论

          本文标题:iOS - 联系人列表分组排序(2016-07-07)

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