有些项目中会需要这样的需求。形成类似于上述的界面。类似于通讯录里边的排序。实现的效果:所有的数据展示的时候,能够分组展示。顺序按照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
请尊重劳动成果,转载请注明出处。谢谢合作。
厚积才能薄发。