UITableView通讯录拼音分组排序

即时通讯类等app会需要做通讯录,有时候UI要求会把通讯录分为一个字母一个section,并在右边加一个索引栏,点击索引栏的字母列表会滑动到制定section,如图:

IMG_1633.PNG

具体做法:

首先获取到的数据应该是通讯录中全部人的数据,这时我们就要对数据进行处理,根据名字的首字母分为一个一个的跟列表的section对应的分区:

1.对中文排序:
网上已经有人集成了字符串排序方法(BMChineseSort),只需要导入BMChineseSort.h及.m文件,就能调用
主要是两个方法:


+(NSMutableArray*)IndexWithArray:(NSArray*)objectArray Key:(NSString*)key;

+(NSMutableArray*)sortObjectArray:(NSArray*)objectArray Key:(NSString*)key;

第一个方法:一个参数objectArray是自定义对象数组,另一个参数key是数组里需要排序的字段名字。方法返回所有出现过的首字母,用于显示在tableview的head以及右侧索引缩写。

第二个方法:,是根据对象的某个字段值对整个数组进行排序,首先,先将字段首字母拼音相同的对象存到同一个数组里,然后把所有的数组再放到结果数组里。

调用示例:
Person对象:

@interface Person : NSObject
@property (strong , nonatomic) NSString * name;
@property (assign , nonatomic) NSInteger number;
@end

数据处理

// array是NSArray< Person *>类型的模拟数据

self.indexArray = [BMChineseSortIndexWithArray:arrayKey:@"name"];

self.letterResultArr = [BMChineseSortsortObjectArray:arrayKey:@"name"];

2.UITableView处理

//section的titleHeader
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [self.indexArray objectAtIndex:section];
}
//section行数
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return [self.indexArray count];
}
//每组section个数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [[self.letterResultArr objectAtIndex:section] count];
}
//section右侧index数组
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
    return self.indexArray;
}
//点击右侧索引表项时调用 索引与section的对应关系
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index{
    return index;
}
//返回cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"];
    if (cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
    }
    //获得对应的Person对象
    Person *p = [[self.letterResultArr objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
    cell.textLabel.text = p.name;
    return cell;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概述在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 12,977评论 3 38
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,995评论 6 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,724评论 18 399
  • 在实现好友列表或通讯录功能时,我们大多需要对名字进行拼音排序及分组,后来在网上发现了YUChineseSortin...
    苹果防腐指南阅读 25,634评论 43 64
  • 或者是太热的缘故,或者是心中忽然有所触动,也或者什么原因都没有,竟忽然在午夜醒来,抱膝坐起来,痴痴的,望着窗外一片...
    青衣018阅读 3,693评论 0 0

友情链接更多精彩内容