_dataSource = [[NSMutableDictionary alloc]init];
_keys = [[NSMutableArray alloc]init];
//获取系统字体库
NSArray *fontList = [UIFont familyNames];
//1.编辑所有的字体名臣并逻辑分组
NSMutableArray *others = [NSMutableArray array];
for (NSString *font in fontList) {
//2.取首字母
char ch = [font characterAtIndex:0];
//3.判断并逻辑分组
//(1)判断是否非字母
if (ch < 'A' || ch > 'z' || (ch > 'Z' && ch < 'a')) {
[others addObject:font];
continue;
}
//(2)判断是否为小写
if (ch >= 'a' && ch <= 'z') {
ch -= 32;
}
NSString *key = [NSString stringWithFormat:@"%c",ch];
//取出对应的key下面的字体名称数组 (这个方法避免了一个空的数组)
NSMutableArray *fonts = [NSMutableArray arrayWithArray:_dataSource[key]];
[fonts addObject:font];
//给数组内部排序
NSArray *array = [fonts sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
[_dataSource setObject:array forKey:key];
}
NSLog(@"%@",_dataSource);
补充:添加A-Z的数组,并排序当做组名
//其他情况
if ([others count] > 0) {
[_dataSource setObject:others forKey:@"#"];
}
[_keys addObjectsFromArray:[_dataSource allKeys]];
//这个对象需要一个参数
// [_keys sortedArrayUsingSelector:<#(SEL)#>]
//这个方法不需要对象的
[_keys sortUsingSelector:@selector(caseInsensitiveCompare:)];
if ([_keys containsObject:@"#"]) {
[_keys removeObject:@"#"];
[_keys addObject:@"#"];
}
笔记:
//取得所有字体
NSArray *font = [UIFont familyNames];
//为什么不用便利构造(为什么用便利构造会崩溃)
// _dataSource = [NSMutableDictionary dictionary];
_dataSource = [[NSMutableDictionary alloc]init];
for (NSString *string in font){
//截取首字母
NSString *firststring = [string substringToIndex:1];
NSMutableArray *fontGroup = [NSMutableArray arrayWithArray:_dataSource[firststring]];
//数据放到数组里
[fontGroup addObject:string];
//排序,给数组内部
NSArray *array = [[NSArray alloc]initWithArray:[fontGroup sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]];
//通过首字母取到数组(有一个问题!!!,重新设置字典的时候会覆盖原来的数据,解决办法,在创建新数组的时候,添加了数据的数组加入新的数组之后再添加,就算覆盖了数据也不会消失,通过字典里面的相应的键得到要添加的数组,说起来很绕,仔细想一下)
//一个思路
//所有字体 -》取出一个数据-》截取首字母 -》两步(1.添加一个新数组,存储数据,2.用全局变量的字典通过键储存这一个数组,3,每次用新数组的时候都会从字典中将添加了数据后的数组给新的数组,让它添加数据,这样就算键值相同,数据被覆盖了,也有添加的所有数据)
[_dataSource setObject:array forKey:firststring];
}
//排序 ,不一个一个排吗 ? 那是怎么排得
// for (NSMutableArray *array in _dataSource){
//
// }
// _scoteArray = [NSArray alloc]
//只是将键排序了(原来的可能是无序的,所以需要走这一步)取得所有的键
_scoteArray = [[NSArray alloc]initWithArray:[_dataSource.allKeys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]];
NSLog(@"%@",_dataSource);