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 下方留言也可以。
请尊重劳动成果,转载请注明出处。谢谢合作。
厚积才能薄发。