参考:http://nshipster.cn/uilocalizedindexedcollation/
UILocalizedIndexedCollation
是一个帮助我们组织列表数据的类,它能够根据地区来生成与之对应区域索引标题。不需要直接创建它的对象,我们可以通过 UILocalizedIndexedCollation +currentCollation
获得一个对应当前地区的单例对象。
UILocalizedIndexedCollation
的首要任务就是决定对于当前地区区域索引标题应该是什么,我们可以通过 sectionIndexTitles
属性来获得它们。
有了这些区域标题,下一步就是判断每个模型对象分别对应哪个区域了。这可以通过实现 -sectionForObject:collationStringSelector:
做到。这个方法返回 NSInteger
类型的索引,它对应了模型对象的指定方法的返回值。方法名称可以为 localizedName
、title
甚至 description
等。
显而易见,列表数据源中会有一个数组,它对应了列表中有多少区域,数组元素表示区域中的每一行。由于整理工作是由 UILocalizedIndexedCollation
来做的,因此理所当然地,也应该由它来为每个区域中的行进行排序。和 -sectionForObject:collationStringSelector:
的实现方式类似,– sortedArrayFromArray:collationStringSelector:
可以为我们基于模型对象的本地化标题来排列模型对象。
- (void)genDataWithCount:(NSInteger)count { NSArray *xings = @[@"赵",@"钱",@"孙",@"李",@"周",@"吴",@"郑",@"王",@"冯",@"陈",@"楚",@"卫",@"蒋",@"沈",@"韩",@"杨"]; NSArray *ming1 = @[@"大",@"美",@"帅",@"应",@"超",@"海",@"江",@"湖",@"春",@"夏",@"秋",@"冬",@"上",@"左",@"有",@"纯"]; NSArray *ming2 = @[@"强",@"好",@"领",@"亮",@"超",@"华",@"奎",@"海",@"工",@"青",@"红",@"潮",@"兵",@"垂",@"刚",@"山"]; for (int i = 0; i < count; i++) { NSString *name = xings[arc4random_uniform((int)xings.count)]; NSString *ming = ming1[arc4random_uniform((int)ming1.count)]; name = [name stringByAppendingString:ming]; if (arc4random_uniform(10) > 3) { NSString *ming = ming2[arc4random_uniform((int)ming2.count)]; name = [name stringByAppendingString:ming]; } LXFriends *friend = [LXFriends new]; friend.name = name; [self.dataArray addObject:friend]; } [self setupTableSections]; } - (void)setupTableSections { UILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation]; // sectionArray创建 NSUInteger numberOfSections = [[collation sectionTitles] count]; NSMutableArray *newSectionsArray = [[NSMutableArray alloc] init]; for (int i = 0; i < numberOfSections; i ++) { [newSectionsArray addObject:[[NSMutableArray alloc] init]]; } // 将数据插入到newSectionArray中 for (LXFriends *frind in self.dataArray) { NSUInteger sectionIndex = [collation sectionForObject:frind collationStringSelector:@selector(name)]; [newSectionsArray[sectionIndex] addObject:frind]; } // 对每一个section中的数据排序 for (int i = 0; i < numberOfSections; i ++) { NSMutableArray *friendsForSection = newSectionsArray[i]; NSArray *sortedFriendsForSection = [collation sortedArrayFromArray:friendsForSection collationStringSelector:@selector(name)]; newSectionsArray[i] = sortedFriendsForSection; } // 移除section中没有数据的section NSMutableArray *temp = [[NSMutableArray alloc] init]; [newSectionsArray enumerateObjectsUsingBlock:^(NSArray *array, NSUInteger idx, BOOL * _Nonnull stop) { if (array.count == 0) { [temp addObject:array]; } }]; [newSectionsArray removeObjectsInArray:temp]; }