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

2016-07-07  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读