效果:

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

(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];
//赋值给cell
cell.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开发-UI学习-sqlite数据库的操作

    IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...

  2. IOS开发-OC学习-常用功能代码片段整理

    IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...

  3. ArcGIS案例学习笔记_3_2_CAD数据导入建库

    ArcGIS案例学习笔记_3_2_CAD数据导入建库 计划时间:第3天下午 内容:CAD数据导入,建库和管理 目的:生成地块多边形,连接属性,管理 问题:CAD存在拓扑错误,标注位置偏移 教程:pdf ...

  4. GIS案例学习笔记-CAD数据分层导入现有模板实例教程

    GIS案例学习笔记-CAD数据分层导入现有模板实例教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 1. 原始数据: CAD数据 目标模板 2. 任务:分5个图层 ...

  5. ArcGIS案例学习笔记-CAD数据自动拓扑检查

    ArcGIS案例学习笔记-CAD数据自动拓扑检查 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:针对CAD数据,自动进行拓扑检查 优点:类别:地理建模项目实例 ...

  6. iOS开发60分钟入门

    原文:https://github.com/qinjx/30min_guides/blob/master/ios.md 本文面向已有其它语言(如Java,C,PHP,Javascript)编程经验的i ...

  7. iOS开发笔记3:XML/JSON数据解析

    这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSeri ...

  8. iOS开发——网络Swift篇&NSURL进行数据请求(POST与GET)

    NSURL进行数据请求(POST与GET)   使用Swift进行iOS开发时,不可避免的要进行远程的数据获取和提交. 其数据请求的方式既可能是POST也可能是GET.同不管是POST还是GET又可以 ...

  9. iOS开发 - OC - 实现本地数据存储的几种方式一

    iOS常用的存储方式介绍 在iOS App开发过程中经常需要操作一些需要持续性保留的数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.本文针对OC中经常使用的一下存储方式做了个整理. 常用 ...

随机推荐

  1. Detours信息泄漏漏洞

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  2. [Cocos2d-x]创建项目

    从cocos2d-x 2.1.4之后,就不提供工程项目模板的安装文件了,我们只能手工修改以前的安装文件,让它连接最新的工程,但是这样很麻烦. 我们可以使用python命令创建cocos2d-x项目 步 ...

  3. linux signal之初学篇

    前言 本博文只总结signal的应用,对signal的kernel实现暂不讨论. 1. linux signal是什么? signal是linux提供的用于进程间通信的一种IPC机制. 2. 如何发送 ...

  4. RFC2889转发性能測试用例设计和自己主动化脚本实现

    一.203_TC_FrameRate-1.tcl set chassisAddr 10.132.238.190 set islot 1 set portList {9 10} ;#端口的排列顺序是po ...

  5. VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表

    原文:VSTO 学习笔记(六)在 Excel 2010中使用RDLC报表 Excel具有强大的图表显示.分析功能,这点毋庸置疑,但是如果将常规MIS系统中的数据以报表的形式在Excel中显示,却并不那 ...

  6. win 开机 Microsoft corparation 滚动栏

    在easybcd里设置  后保存!

  7. 23、Cocos2dx 3.0游戏开发找小三之粒子系统:你那里下雪了吗?

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30485919 春雨惊春清谷天,夏满芒夏暑相连, 秋处 ...

  8. 菜鸟学Java(十九)——WEB项目測试好帮手,Maven+Jetty

    做WEB开发,測试是一件非常费时间的事情.所以我们就应该用更简单.更快捷的方式进行測试.今天就向大家介绍一个轻量级的容器--jetty.j今天说的etty是Maven的一个插件jetty-maven- ...

  9. Android的PackageManager的使用

    Android系统提供了很多服务管理的类,包括ActivityManager.PowerManager(电源管理).AudioManager(音频管理)以及PackageManager管理类.Pack ...

  10. (转载)浅析error LNK2001: unresolved external symbol "public: __thisc...

    学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于      编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,      编译都已通过.产生连接错误的原因非常多 ...