1 // 2 // ViewController.m 3 // 汽车品牌 4 // 5 // Created by 刘羽 on 15/12/31. 6 // Copyright © 2015年 LX. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "Car.h" 11 #import "CarGroup.h" 12 13 @interface ViewController ()14 15 @property(strong,nonatomic)NSArray *carGroups; 16 @property(strong,nonatomic)UITableView *tableView; 17 18 19 @end 20 21 @implementation ViewController 22 23 -(UITableView *)tableView 24 { 25 if (_tableView == nil) { 26 _tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; 27 _tableView.dataSource = self; 28 [self.view addSubview:_tableView]; 29 } 30 return _tableView; 31 32 } 33 34 -(NSArray *)carGroups 35 { 36 if (_carGroups == nil) { 37 //调用CarGroup类的 carGroups方法 返回模型数组 38 _carGroups = [CarGroup carGroups]; 39 } 40 return _carGroups; 41 } 42 43 44 45 46 - (void)viewDidLoad { 47 [super viewDidLoad]; 48 //调用tablelView添加到视图 49 [self tableView]; 50 } 51 52 #pragma mark - 调用数据源方法 53 54 //返回分组总数 55 //NSInteger 不是对象类型 没有* 56 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 57 { 58 return self.carGroups.count; 59 } 60 61 //返回每一组的数量:这里每一组只算车的数量,不算标题title 62 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 63 { //获得每一个分组 64 CarGroup *group = self.carGroups[section]; 65 //返回每一个分组中车数组的数量 66 return group.cars.count; 67 } 68 69 //设置单元格 70 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 71 { 72 //可重用标示符 73 static NSString *ID = @"Cell"; 74 //让表格缓冲区查找可重用cell 75 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; 76 //如果没有找到 77 if (cell == nil) { 78 //实例化cell 79 cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; 80 81 } 82 //设置cell的内容 83 //1>取出数据模型 84 CarGroup *group = self.carGroups[indexPath.section]; 85 Car *car = group.cars[indexPath.row]; 86 //2>设置数据 87 cell.imageView.image = [UIImage imageNamed:car.icon]; 88 cell.textLabel.text = car.name; 89 90 return cell; 91 } 92 93 //设置标题 94 -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 95 { 96 //找到group 97 CarGroup *group = self.carGroups[section]; 98 return group.title; 99 }100 101 //设置右侧索引列表102 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView103 {104 //索引数组中的内容跟分组无关105 //索引数组中的下标对应的是分组的下标106 // 返回self.carGroup中title的数组107 // NSMutableArray *arrayM = [NSMutableArray array];108 // for (HMCarGroup *group in self.carGroups) {109 // [arrayM addObject:group.title];110 // }111 // return arrayM;112 113 // KVC是cocoa的大招114 // 用来间接获取或者修改对象属性的方式115 // 使用KVC在获取数值时,如果指定对象不包含keyPath的"键名",会自动进入对象的内部查找116 // 如果取值的对象是一个数组,同样返回一个数组117 //一句代码就可以替代上面的四句代码118 return [self.carGroups valueForKeyPath:@"title"];119 }120 121 122 @end
//// CarGroup.h// 汽车品牌//// Created by 刘羽 on 15/12/31.// Copyright © 2015年 LX. All rights reserved.//#import@interface CarGroup : NSObject//车首字母@property (strong,nonatomic)NSString *title;//车的数组,存放的是Car的模型数据@property (strong,nonatomic)NSArray *cars;-(instancetype)initWithDict:(NSDictionary *)dict;+(instancetype)carGroupWithDict:(NSDictionary *)dict;+(NSArray *)carGroups;@end
//// CarGroup.m// 汽车品牌//// Created by 刘羽 on 15/12/31.// Copyright © 2015年 LX. All rights reserved.//#import "CarGroup.h"#import "Car.h"@implementation CarGroup-(instancetype)initWithDict:(NSDictionary *)dict{ self = [super init]; if (self) { //先将CarGroup中的title字典用kvc方法转为模型 [self setValue:dict[@"title"] forKey:@"title"]; //然后将CarGroup中的汽车数组转给Car类进行字典转模型处理并返回模型存入car数组 self.cars = [Car carsWithArray:dict[@"cars"]]; } return self;}+(instancetype)carGroupWithDict:(NSDictionary *)dict{ //传递给上面的对象方法去处理 return [[self alloc]initWithDict:dict];}//加载plist 并调用以上方法转为数组模型+(NSArray *)carGroups{ //创建一个集合存储plist NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cars_total.plist" ofType:nil]]; //创建一个新的可变集合 NSMutableArray *arrayM = [NSMutableArray array]; //遍历array集合,将plist转为模型 for (NSDictionary *dict in array) { [arrayM addObject:[self carGroupWithDict:dict]]; } return arrayM;}//重写description方法,便于调试-(NSString *)description{ return [NSString stringWithFormat:@"<%@ : %p> {title: %@ , cars: %@}",self.class,self,self.title,self.cars];}@end
//// Car.h// 汽车品牌//// Created by 刘羽 on 15/12/31.// Copyright © 2015年 LX. All rights reserved.//#import@interface Car : NSObject@property(strong,nonatomic)NSString *name;@property(strong,nonatomic)NSString *icon;-(instancetype)initWithDict:(NSDictionary *)dict;+(instancetype)carWithDict:(NSDictionary *)dict;+(NSArray *)carsWithArray:(NSArray *)array;@end
//// Car.m// 汽车品牌//// Created by 刘羽 on 15/12/31.// Copyright © 2015年 LX. All rights reserved.//#import "Car.h"@implementation Car-(instancetype)initWithDict:(NSDictionary *)dict{ self = [super init]; if (self) { [self setValuesForKeysWithDictionary:dict]; } return self;}+(instancetype)carWithDict:(NSDictionary *)dict{ return [[self alloc]initWithDict:dict];}+(NSArray *)carsWithArray:(NSArray *)array{ NSMutableArray *arrayM = [NSMutableArray array]; for (NSDictionary *dict in array) { //这里注意 方法不要写错 不要写成carsWithArray 这样变死循环了 [arrayM addObject:[self carWithDict:dict]]; } return arrayM; }@end