前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >demo3同通讯录展示的方式分组排序

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

作者头像
用户1219438
发布2018-02-01 15:59:34
8450
发布2018-02-01 15:59:34
举报
文章被收录于专栏:AliceAlice

按A-Z顺序分组展示

有些项目中会需要这样的需求。形成类似于上述的界面。类似于通讯录里边的排序。实现的效果:所有的数据展示的时候,能够分组展示。顺序按照A-Z的书序进行排列。如果不是以A-Z开头,则默认为#一列。

一般我们从服务器拿到的数据都是一个数组。里边包含了所有的数据。

代码语言:javascript
复制
思路:思路很重要!!!

我的思路详解:首先界面的话 1.需要组的名称。组的名称就是这些数据的首字母。所以说这里需要一个数组,来存储这个组的名字。sortedSectionTitles

2.就是每一组下边的数据的排序了。针对这个的实现我们需要一个字典originDic 这个字典的样子类似于:

{ “A”:["Alice","Asss","Addd"],

    "B":["blose","Bob"]

}

的结构。

核心代码如下:

手动创建数据组

代码语言:javascript
复制
    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的首字母

代码语言:javascript
复制
- (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  下方留言也可以。

请尊重劳动成果,转载请注明出处。谢谢合作。

厚积才能薄发。 

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-01-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档