要实现如图效果的选择界面,我们应该怎么做呢?
首先我们有一个城市数据列表,假设是无序的,那么我们首先要对其进行排序。
假设我们从服务器获取到数据,并将其存在一个数组中,数组中每一个地址都是一个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。