【iOS开发-60】案例学习:多组数据的tableView设置、添加右側组索引、多层数据模型设置以及valueForKeyPath...
效果:
这里的数据模型有两层:每一组汽车是一层模型,每一组里面的每一行汽车品牌也是一层模型。
(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...相关推荐
- iOS开发通过微信学习WCDB(二)
通过<iOS开发通过微信学习WCDB(一)>这篇博客,相信大家对WCDB已经有了一个简单的了解和认识.这篇文章主要是为了进一步深入的学习 ###数据库加密 上篇文章中提到了,自己在 ...
- 移动互联网开发教学案例学习-13
2021SC@SDUSC 目录 案例--draw_compare AdjustBitmap类 sizeBitmap方法 scaleBitmap方法 getCircleBitmap方法 对本学期移动互联 ...
- iOS开发Swift语言学习教程-欧阳坚-专题视频课程
iOS开发Swift语言学习教程-16345人已学习 课程介绍 Swift这套视频是针对有Objective-C/iOS基础,想转成Swift开发的学习视频,视频中从Swift语法,结 ...
- iOS开发60分钟入门学习精华
有过脚本开发经验的人(如Javascript,PHP,Shell)在刚开始学习iOS开发的时候,会觉得iOS开发的学习曲线比脚本语言要高,是的,这种感觉是对的.因为学iOS开发,不仅是学习一门新语言, ...
- 2021新出iOS开发程序员学习路线,涵盖大部分iOS知识体系【不会没收藏吧!】
这个栏目将持续更新--请iOS的小伙伴关注! 整理不易,如果您觉得还不错,麻烦在文末 "点个赞" 或者 评论 "Mark",谢谢您的支持 1.字符串常用方法 字 ...
- IOS 开发高手课 学习笔记(第二部分)
第二部分主要是性能监控相关 Part 7. 包大小:如何从资源和代码层面实现全方位瘦身? 官方 App Thinning App Thinning 是由苹果公司推出的一项可以改善 App 下载进程的新 ...
- iOS开发通过微信学习WCDB(一)
最近通过对微信ipa包解压发现微信有使用WCDB这个开源库,搜索了一下了解到WCDB(WeChat Database)是一个高效.完整.易用的移动数据库框架,基于SQLCipher,支持iOS, ...
- IOS 开发高手课 学习笔记(第三部分)
这一部分戴铭老师说的是一些底层的东西,然后推荐了一下第三方库,但是看同学者的反应,很多内容(主要是推荐的第三方库)都不是很完善(不能完全接受),所以这部分内容,要谨慎对待,然后自己实践和查询足够的资料 ...
- iOS开发23:通过归档永久存储数据
2019独角兽企业重金招聘Python工程师标准>>> 之前一篇文章<iOS开发20:使用Settings Bundle为程序添加设置项>中简单介绍了怎样在Setting ...
最新文章
- 飞书面向所有企业和组织免费开放,2020我们一起拥抱线上协作新方式
- RSA大会播报 – 2014最佳安全博客提名
- mysql cursor 嵌套_MYSQL 存储过程多游标嵌套遍历
- Bootstrap 表单控件的尺寸
- ES6语法---解构赋值
- c语言编程和PS,求高人剖析下这道C语言编程题(PS:越详细越好)
- 马云:希望下辈子能做个好女人,男人离开女人“啥都不是”
- apache点NET环境
- request[limit]取不到前台的值_基于uFUN开发板的心率计(二)动态阈值算法获取心率值...
- paip.python错误解决24
- 计算机网络之物理层、链路层、网络层
- 学习STM32 RS485 原理与应用
- NIOS II 烧写epcs中遇到的问题
- 年度盘点 | 安全测试者偏爱的安全测试工具
- java阿里面试官直接告诉你录取答案,你还在犹豫那就晚了
- 玩转这些视频制作软件,让你成为短视频高手
- c语言怎么编写数控g指令,数控车床编程--G 代码 M代码命令
- 比较令人惊叹的FastDB和SQLite的RAMDISK内的性能对比
- 解决iOS UITableView分组header悬浮,每个section header上面有一段空白间距
- 鞍山树人计算机学校宿舍,南开大学校务公报2016年第12期-信息公开.pdf