效果:

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

(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. [Android学习笔记]ListView中含有Button导致无法响应onItemClick回调的解决办法

    转自:http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html 问题描述: 当ListView的Item中的控件只是一些展示类 ...

  2. php 用递归实现的无限级别分类

    <?php header("Content-type:text/html; charset=utf-8"); /**  *   * @category contry_cate ...

  3. wkhtmtopdf--高分辨率转HTML成PDF--目录篇

    原文:wkhtmtopdf--高分辨率转HTML成PDF--目录篇 wkhtmtopdf--高分辨率转HTML成PDF(一):简述wkhtmtopdf的简介和安装 wkhtmtopdf--高分辨率转H ...

  4. Java创建、重命名、删除文件和文件夹(转)

    Java的文件操作太基础,缺乏很多实用工具,比如对目录的操作,支持就非常的差了.如果你经常用Java操作文件或文件夹,你会觉得反复编写这些代码是令人沮丧的问题,而且要大量用到递归. 下面是的一个解决方 ...

  5. SRM 638 Div2

    2333... 因为TC过少的参与者.加上不断fst 我掉了div2该. 幸运的是完成的背div1该.. 250 水的问题 500 水的问题.. 直接bfs扩展即可了 注意判重.  我还用康托展开了真 ...

  6. [置顶] 一步一步学android之事件篇——下拉列表事件

    上一篇RadioGroup比较简单,所以再学习个spinner的OnItemSelectedListener事件,前面说过spinner的主要功能就是提供列表显示的选择,比如我们在选择城市的时候就会用 ...

  7. 设置SVN忽略文件和文件夹(文件夹)

    在多数项目中你总会有文件和文件夹不须要进行版本号控制.这可能包含一些由编译器生成的文件,*.obj,*.lst,也许是一个用于存放可运行程序的输出文件夹.仅仅要你提交改动,TortoiseSVN 就会 ...

  8. Net处理html页面元素工具类(HtmlAgilityPack.dll)的使用

    现在,在不少应用场合中都希望做到数据抓取,特别是基于网页部分的抓取.其实网页抓取的过程实际上是通过编程的方法,去抓取不同网站网页后,再进行 分析筛选的过程.比如,有的比较购物网站,会同时去抓取不同购物 ...

  9. 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(1)

    原文: http://www.raywenderlich.com/64623/make-narrated-book-using-avspeechsynthesizer-ios-7 随着 PageVie ...

  10. HighChart学习-更新数据data Series与重绘

    一:HighChart介绍 基于JQuery的纯JavaScript的图标库,支持各种图表显示,同时还支持Mootools 与Prototype详细版本支持在这里: JQuery 1.3.2 - 1. ...