demo3同通讯录展示的方式分组排序

按A-Z顺序分组展示
有些项目中会需要这样的需求。形成类似于上述的界面。类似于通讯录里边的排序。实现的效果:所有的数据展示的时候,能够分组展示。顺序按照A-Z的书序进行排列。如果不是以A-Z开头,则默认为#一列。
一般我们从服务器拿到的数据都是一个数组。里边包含了所有的数据。
思路:思路很重要!!!
我的思路详解:首先界面的话 1.需要组的名称。组的名称就是这些数据的首字母。所以说这里需要一个数组,来存储这个组的名字。sortedSectionTitles
2.就是每一组下边的数据的排序了。针对这个的实现我们需要一个字典originDic 这个字典的样子类似于:
{ “A”:["Alice","Asss","Addd"],
    "B":["blose","Bob"]
}
的结构。
核心代码如下:
手动创建数据组
    for (ACCellModel *model in originArray) {
        //每一个模型中的开始的第一字母。
        NSString *indexKey = [self indexTitleForName:model.nickName];
        //创建一个数组用来接收
        NSMutableArray *names = originDic[indexKey];
        if (!names) {
            names = [NSMutableArray array];
            originDic[indexKey] = names;
        }
        [names addObject:model];
        //应该在这里对名字再进行一下排序
        [names sortUsingComparator:^NSComparisonResult(ACCellModel *obj1, ACCellModel *obj2) {
            //按照名字进行排序
            NSComparisonResult result = [obj1.nickName compare:obj2.nickName];
            return result;
        }];
    }
    //对源数据的key进行排序
    sortedSectionTitles = [[originDic allKeys]sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
#pragma mark - 返回nickname的首字母
- (NSString *)indexTitleForName:(NSString *)name {
    static NSString *otherKey = @"#";
    if (!name) {
        return otherKey;
    }
    //那到首字母
    NSMutableString *mutableString = [NSMutableString stringWithString:[name substringToIndex:1]];
    CFMutableStringRef mutableStringRef = (__bridge CFMutableStringRef)mutableString;
    CFStringTransform(mutableStringRef, nil, kCFStringTransformToLatin, NO);
    CFStringTransform(mutableStringRef, nil, kCFStringTransformStripCombiningMarks, NO);
    NSString *key = [[mutableString uppercaseString] substringToIndex:1];
    unichar capital = [key characterAtIndex:0];
    if (capital >= 'A' && capital <= 'Z') {
        return key;
    }
    return otherKey;
}
其实思路蛮简单的。滤清了思路,决会觉得so easy。
如有任何疑问,请联系本作者邮箱:673658918@qq.com QQ:673658917 下方留言也可以。
请尊重劳动成果,转载请注明出处。谢谢合作。
厚积才能薄发。
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan
demo3同通讯录展示的方式分组排序的更多相关文章
- SQL语句分组排序,多表关联排序
		SQL语句分组排序,多表关联排序总结几种常见的方法: 案例一: 在查询结果中按人数降序排列,若人数相同,则按课程号升序排列? 分析:单个表内的多个字段排序,一般可以直接用逗号分割实现. select ... 
- 本地化下按首字母分组排序的神器——UILocalizedIndexedCollation
		最近在整一个很简单的通讯录相关的项目,通讯录当然就少不了按首字母或者汉字拼音首字母分组排序索引.因为按照我一贯的的做法,都是想要做成更通用的.支持本地化的,所以这就纠结了,世界各地的语言啊我去,我顶多 ... 
- mysql 分组排序前n + 长表转宽表
		MySQL数据库优化的八种方式(经典必看) 建表 CREATE TABLE if not EXISTS `bb` ( `id` int not null primary key auto_increm ... 
- 在使用pandas 0.23.4对日期进行分组排序时报错
		date_df["rank_num"] = date_df.groupby("issuer_id").report_date.agg("rank&qu ... 
- day36 03-Hibernate检索方式:排序、参数绑定、投影查询
		排序之后是分页查询. 检索单个对象 还可以进行参数的绑定. HQL的参数绑定,按参数名称绑定或者是按参数位置绑定. 还可以用投影的操作,投影的操作是只查询这里面的某几个属性.只查询某一个属性,查询多个 ... 
- SQL分组排序后取每组最新一条数据的另一种思路
		在hibernate框架和mysql.oracle两种数据库兼容的项目中实现查询每个id最新更新的一条数据. 之前工作中一直用的mybatis+oracle数据库这种,一般写这类分组排序取每组最新一条 ... 
- 一条Sql语句分组排序并且限制显示的数据条数
		如果我想得到这样一个结果集:分组排序,并且每组限定记录集的数量,用一条SQL语句能办到吗? 比如说,我想找出学生期末考试中,每科的前3名,并按成绩排序,只用一条SQL语句,该怎么写? 表[TScore ... 
- oracle 分组排序函数
		项目开发中,我们有时会碰到需要分组排序来解决问题的情况:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示例和 ... 
- oracle中分组排序函数用法 - 转
		项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ... 
随机推荐
- Jenkins+tomcat自动发布的热部署/重启及遇到的坑解决办法
			一.背景 公司的项目一直手动maven打包.上传服务器.关闭/开启tomcat,整个流程下来耗时耗力,虽然可以将所有流程通过shell脚本一次性解决,但如果可以通过idea的Jenkins插件一键自动 ... 
- 一、python 基础之基础语法
			一.变量命名规则 1.驼峰命名 大驼峰 MyName = 'leon' 小驼峰 myName = 'Amy' 2.下划线命名 my_name = 'jack' 建议:变量名或者文件名使用下划线命名方式 ... 
- JVM 专题十四:本地方法接口
			1. 本地方法接口 2. 什么是本地方法? 简单来讲,一个Native Method就是一个Java调用非Java代码的接口.一个Native Method是这样一个java方法:该方法的实现由非Ja ... 
- java 面向对象(三十七):反射(一) 反射的概述
			1.本章的主要内容 2.关于反射的理解 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属 ... 
- 数据可视化之powerBI技巧(十三)PowerBI作图技巧:动态坐标轴
			之前的文章中介绍了如何制作动态的分析指标,这篇进行文章再介绍一下如何制作动态的坐标轴. 假设要分析的数据为销售额,分别从产品和地区两个维度进行分析,要实现的效果是,如果选择的是产品,则坐标轴是各个产品 ... 
- XSS原理及代码分析
			前言 XSS又叫跨站脚本攻击,是一种对网站应用程序的安全漏洞攻击技术.它允许恶意用户将代码注入网页,其他用户在浏览网页时就会受到影响.XSS分为三种:反射型,存储型,和DOM型.下面我会构造有缺陷的代 ... 
- 01-flask电商项目开发基础配置
			本项目前端采用vue-cli的脚手架,后端采用Flask的Web框架.项目通过完成用户管理.权限管理.商品管理.订单管理.统计管理等功能,综合了前后端的知识,希望使大家都能受益. 1.使用到的技术如下 ... 
- android 调试的一些问题解决1
			1.系统自带的机器跑起来太卡,我想用雷电模拟器来运行.可是打开后找不到设备怎么弄? 解决办法: 步骤1:>>>运行模拟器 步骤2:>>>win + r 打开cmd ... 
- 设计模式:decade模式
			目的:为系统中的一组联动接口提供一个高层次的接口,从而降低系统的复杂性 优点:使用窗口模式可以使得接口变少 继承关系图: 例子: class Subsystem1 { public: void Ope ... 
- 题解 洛谷 P3521 【[POI2011]ROT-Tree Rotations】
			给定一棵二叉树,叶子节点有权值,可以进行若干次交换一个节点的左右儿子的操作,使前序遍历叶子的逆序对最少. 考虑一个节点下子树逆序对的产生: ① 只在左子树中产生. ② 只在右子树中产生. ③ 在左子树 ... 
