城市列表排序

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cc835297454/article/details/84201825

 

要实现如图效果的选择界面,我们应该怎么做呢?

首先我们有一个城市数据列表,假设是无序的,那么我们首先要对其进行排序。

假设我们从服务器获取到数据,并将其存在一个数组中,数组中每一个地址都是一个CCCityModel,该model包含了地址相关信息。以下是排序处理:

//将服务器获取到的citiesArray数组进行分组排序

- (NSMutableArray *)convertAToZArray:(NSMutableArray *)citiesArray{

    //用来存放分组之后的数据
    NSMutableDictionary *cityDic = [NSMutableDictionary dictionary];

    //按首字母分组,存放在cityDic中
    for (int i = 0; i < [citiesArray count]; i++) {

        CCCityModel *cityModel = citiesArray[i];

//firstCharactor方法在下边,是将城市的第一个字母取出
        NSString *firstChar  = [self firstCharactor:cityModel.name];

/*判断最大的字典里所有的key是否包含当前取到的城市首字母,如果包含,则先取出对应key的数组value,
把新的值存放到对应的数组里,然后把这个数组重新赋值给这个key,完成添加。如果不包含则吧对应的
城市放到初始化的小数组中,然后新建一个键值对,把这个小数组赋值给这个key*/   

        NSMutableArray *groupArray = nil;

        if([[cityDic allKeys] containsObject:firstChar]){

            groupArray = [cityDic objectForKey:firstChar];
            [groupArray addObject:cityModel];
            [cityDic setObject:groupArray forKey:firstChar];

        }else{

            groupArray = [[NSMutableArray alloc] initWithObjects:cityModel, nil];
            [cityDic setObject:groupArray forKey:firstChar];

        }
    }
//此时cityDic中已经将所有城市按照首字母分组好了
    

    //所有包含的首字母按照A-Z排序
    NSMutableArray *allCityFirstCharArray = [NSMutableArray arrayWithArray:[[cityDic allKeys] sortedArrayUsingSelector:@selector(compare:)]];

//按照A-Z的顺序重组数据,对分组的城市进行排序, allCityArray存放最终数据

    NSMutableArray *allCityArray = [NSMutableArray array];

    for (int i = 0; i < [allCityFirstCharArray count]; i++) {

//取出对应字母分组的数组
        NSMutableArray *groupArray = [cityDic objectForKey:allCityFirstCharArray[i]];

//对其按照A-Z的顺序排序, nickNameSort为排序方法
        NSArray *sortArr = [ccArray sortedArrayUsingFunction:nickNameSort context:NULL];

//存放首字母以及对应排序后的城市
        NSDictionary *dic = [NSDictionary dictionaryWithObject:sortArr forKey:allCityFirstCharArray[i]];

//加入最终数组
        [allCityArray addObject:dic];

    }

    return allCityArray;
}

//若第一个字的第一个字母相同,则按第一个字的第二个字母比较,若第一个字的字母完全相同,按第二个字的首字母继续排序,依此类推,也可以根据自己的业务需求定制更复杂的比较逻辑
NSInteger nickNameSort(id cityFitst, id citySecond, void *context){

    //类型转换

    CCCityModel *cityF = (CCCityModel *)cityFitst;

    CCCityModel *cityS = (CCCityModel *)citySecond;

    return  [cityF.name localizedCompare:cityS.name];
}


//获取汉字首字母
- (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];

}

通过以上方法得到一个按字母分组排序后的数组作为tableview的数据源,然后实现tableview的相关方法展示到界面上即可,这里已经没有什么难度就不再叙说。

然后是右侧索引的创建,这里使用的是DSectionIndexView,也很简单,可参考https://www.jianshu.com/p/d4213ea7e058

最后是上边搜索功能,我这里是将从服务器获取的未分组排序的数组缓存了,搜索都是操作的该数组生成新的数据源然后刷新tableview。

https://www.jianshu.com/p/69ff8ed1857f多音字处理方法

展开阅读全文

没有更多推荐了,返回首页