效果:

这里的数据模型有两层:每一组汽车是一层模型,每一组里面的每一行汽车品牌也是一层模型。

(1)我们先创建一个WSCars模型。

在WSCars.h中:

#import <Foundation/Foundation.h>@interface WSCars : NSObject
@property(nonatomic,copy) NSString *icon;
@property(nonatomic,copy) NSString *name;+(WSCars *)carsWithDict:(NSDictionary *)dict;
-(WSCars *)initWithDict:(NSDictionary *)dict;
@end

在WSCars.m中:

#import "WSCars.h"@implementation WSCars+(WSCars *)carsWithDict:(NSDictionary *)dict{return [[self alloc]initWithDict:dict];
}-(WSCars *)initWithDict:(NSDictionary *)dict{if ([super init]) {[self setValuesForKeysWithDictionary:dict];}return self;
}@end

(2)再创建一个汽车组模型,WSCarGroup。

在WSCarGroup.h中:

#import <Foundation/Foundation.h>@interface WSCarGroup : NSObject
@property(nonatomic,copy) NSString * title;
@property(nonatomic,strong) NSArray *cars;+(WSCarGroup *)carGroupWithDict:(NSDictionary *)dict;
-(WSCarGroup *)initWithDict:(NSDictionary *)dict;
@end

在WSCarGroup.m中:(此处做了1次字典转模型,即把每一个汽车数据转成WSCars对象)

#import "WSCarGroup.h"
#import "WSCars.h"
@implementation WSCarGroup+(WSCarGroup *)carGroupWithDict:(NSDictionary *)dict{return [[self alloc]initWithDict:dict];
}-(WSCarGroup *)initWithDict:(NSDictionary *)dict{if ([super init]) {self.title=dict[@"title"];NSArray *dictArray=dict[@"cars"];NSMutableArray *muArray=[[NSMutableArray alloc]init];for (NSDictionary * dic in dictArray) {WSCars *car=[[WSCars alloc]initWithDict:dic];[muArray addObject:car];}self.cars=muArray;}return self;
}@end

(3)然后在ViewController.m中,定义数组,而且把字典转模型

@property (nonatomic,strong) NSArray *carsArray;
//字典转模型
- (NSArray *)carsArray{if (_carsArray==nil) {NSString *path=[[NSBundle mainBundle]pathForResource:@"cars_total.plist" ofType:nil];NSArray *totalArray=[NSArray arrayWithContentsOfFile:path];NSMutableArray *muArray=[[NSMutableArray alloc]init];for (NSDictionary *dict in totalArray) {WSCarGroup *carGroup=[[WSCarGroup alloc]initWithDict:dict];[muArray addObject:carGroup];}_carsArray=muArray;}return _carsArray;
}

数组工作至此完毕。

(4)拖拽一个tableView,而且定义成变量。这个控制器被当成数据源,所以遵守协议。

@interface ViewController ()<UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableView;

(5)而且把数据源设置成当前控制器,顺便设置一下行高

- (void)viewDidLoad {//设置数据源self.tableView.dataSource=self;//设置行高self.tableView.rowHeight=60;[super viewDidLoad];
}

(6)设置tableView的组、行和cell数据和组名字。

//设置多少组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{return self.carsArray.count;
}
//设置多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{WSCarGroup *carGroup=self.carsArray[section];return carGroup.cars.count;
}
//设置cell内容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{//先缓存池,性能优化static NSString *ID=@"car";UITableViewCell *cell=[self.tableView dequeueReusableCellWithIdentifier:ID];if (cell==nil) {cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];}//取出数据WSCarGroup *carGroup=self.carsArray[indexPath.section];WSCars *cars=carGroup.cars[indexPath.row];//赋值给cellcell.textLabel.text=cars.name;cell.imageView.image=[UIImage imageNamed:cars.icon];return cell;
}
//设置组名
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{WSCarGroup *carGroup=self.carsArray[section];return carGroup.title;
}

(7)设置组索引

-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{//须要返回一个数组//用valueForKey仅仅能在本层级字典中查找,而self.carsArray是数组,且没有titlekeyword//用valueForKeyPath能够在本级及下级字典数组中查找,有path路径return [self.carsArray valueForKeyPath:@"title"];
}

(8)为方便展示观看:

//隐藏状态栏
-(BOOL)prefersStatusBarHidden{return YES;
}

总结:

——难度在于字典转模型的地方,由于模型有2层级。

——添加了一个知识点,即显示组索引。用sectionIndexTitlesForTableView方法,返回值是一个数组,所以我们这里也用到了valueForKeyPath这种方法取得一个字符串组。

【iOS开发-60】案例学习:多组数据的tableView设置、添加右側组索引、多层数据模型设置以及valueForKeyPath...相关推荐

  1. iOS开发通过微信学习WCDB(二)

      通过<iOS开发通过微信学习WCDB(一)>这篇博客,相信大家对WCDB已经有了一个简单的了解和认识.这篇文章主要是为了进一步深入的学习 ###数据库加密   上篇文章中提到了,自己在 ...

  2. 移动互联网开发教学案例学习-13

    2021SC@SDUSC 目录 案例--draw_compare AdjustBitmap类 sizeBitmap方法 scaleBitmap方法 getCircleBitmap方法 对本学期移动互联 ...

  3. iOS开发Swift语言学习教程-欧阳坚-专题视频课程

    iOS开发Swift语言学习教程-16345人已学习 课程介绍         Swift这套视频是针对有Objective-C/iOS基础,想转成Swift开发的学习视频,视频中从Swift语法,结 ...

  4. iOS开发60分钟入门学习精华

    有过脚本开发经验的人(如Javascript,PHP,Shell)在刚开始学习iOS开发的时候,会觉得iOS开发的学习曲线比脚本语言要高,是的,这种感觉是对的.因为学iOS开发,不仅是学习一门新语言, ...

  5. 2021新出iOS开发程序员学习路线,涵盖大部分iOS知识体系【不会没收藏吧!】

    这个栏目将持续更新--请iOS的小伙伴关注! 整理不易,如果您觉得还不错,麻烦在文末 "点个赞" 或者 评论 "Mark",谢谢您的支持 1.字符串常用方法 字 ...

  6. IOS 开发高手课 学习笔记(第二部分)

    第二部分主要是性能监控相关 Part 7. 包大小:如何从资源和代码层面实现全方位瘦身? 官方 App Thinning App Thinning 是由苹果公司推出的一项可以改善 App 下载进程的新 ...

  7. iOS开发通过微信学习WCDB(一)

      最近通过对微信ipa包解压发现微信有使用WCDB这个开源库,搜索了一下了解到WCDB(WeChat Database)是一个高效.完整.易用的移动数据库框架,基于SQLCipher,支持iOS, ...

  8. IOS 开发高手课 学习笔记(第三部分)

    这一部分戴铭老师说的是一些底层的东西,然后推荐了一下第三方库,但是看同学者的反应,很多内容(主要是推荐的第三方库)都不是很完善(不能完全接受),所以这部分内容,要谨慎对待,然后自己实践和查询足够的资料 ...

  9. iOS开发23:通过归档永久存储数据

    2019独角兽企业重金招聘Python工程师标准>>> 之前一篇文章<iOS开发20:使用Settings Bundle为程序添加设置项>中简单介绍了怎样在Setting ...

最新文章

  1. 飞书面向所有企业和组织免费开放,2020我们一起拥抱线上协作新方式
  2. RSA大会播报 – 2014最佳安全博客提名
  3. mysql cursor 嵌套_MYSQL 存储过程多游标嵌套遍历
  4. Bootstrap 表单控件的尺寸
  5. ES6语法---解构赋值
  6. c语言编程和PS,求高人剖析下这道C语言编程题(PS:越详细越好)
  7. 马云:希望下辈子能做个好女人,男人离开女人“啥都不是”
  8. apache点NET环境
  9. request[limit]取不到前台的值_基于uFUN开发板的心率计(二)动态阈值算法获取心率值...
  10. paip.python错误解决24
  11. 计算机网络之物理层、链路层、网络层
  12. 学习STM32 RS485 原理与应用
  13. NIOS II 烧写epcs中遇到的问题
  14. 年度盘点 | 安全测试者偏爱的安全测试工具
  15. java阿里面试官直接告诉你录取答案,你还在犹豫那就晚了
  16. 玩转这些视频制作软件,让你成为短视频高手
  17. c语言怎么编写数控g指令,数控车床编程--G 代码 M代码命令
  18. 比较令人惊叹的FastDB和SQLite的RAMDISK内的性能对比
  19. 解决iOS UITableView分组header悬浮,每个section header上面有一段空白间距
  20. 鞍山树人计算机学校宿舍,南开大学校务公报2016年第12期-信息公开.pdf

热门文章

  1. calc(~,mac电脑set-cookies要域名和请求域名相同
  2. 我总结的 jsonp
  3. Java RESTful Web Service实战(第2版) 2.3 传输格式
  4. 多线程模拟实现生产者/消费者模型 (借鉴)
  5. MySQL之Handler_read_*查看索引使用情况
  6. 我的Linux笔记5--我要连网
  7. 显示1至20相同数字相乘的结果,若值比50小就不显示
  8. 程序员面试金典——7.5平分的直线
  9. 基本法求解位示图编号问题
  10. 一行shell解决Mac文件乱码问题