【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];
//赋值给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的更多相关文章
- IOS开发-UI学习-sqlite数据库的操作
IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...
- IOS开发-OC学习-常用功能代码片段整理
IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...
- ArcGIS案例学习笔记_3_2_CAD数据导入建库
ArcGIS案例学习笔记_3_2_CAD数据导入建库 计划时间:第3天下午 内容:CAD数据导入,建库和管理 目的:生成地块多边形,连接属性,管理 问题:CAD存在拓扑错误,标注位置偏移 教程:pdf ...
- GIS案例学习笔记-CAD数据分层导入现有模板实例教程
GIS案例学习笔记-CAD数据分层导入现有模板实例教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 1. 原始数据: CAD数据 目标模板 2. 任务:分5个图层 ...
- ArcGIS案例学习笔记-CAD数据自动拓扑检查
ArcGIS案例学习笔记-CAD数据自动拓扑检查 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:针对CAD数据,自动进行拓扑检查 优点:类别:地理建模项目实例 ...
- iOS开发60分钟入门
原文:https://github.com/qinjx/30min_guides/blob/master/ios.md 本文面向已有其它语言(如Java,C,PHP,Javascript)编程经验的i ...
- iOS开发笔记3:XML/JSON数据解析
这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSeri ...
- iOS开发——网络Swift篇&NSURL进行数据请求(POST与GET)
NSURL进行数据请求(POST与GET) 使用Swift进行iOS开发时,不可避免的要进行远程的数据获取和提交. 其数据请求的方式既可能是POST也可能是GET.同不管是POST还是GET又可以 ...
- iOS开发 - OC - 实现本地数据存储的几种方式一
iOS常用的存储方式介绍 在iOS App开发过程中经常需要操作一些需要持续性保留的数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.本文针对OC中经常使用的一下存储方式做了个整理. 常用 ...
随机推荐
- KMP算法(具体求串的next[n])
怎么求串的模式值next[n] )next[0]= -1 意义:不论什么串的第一个字符的模式值规定为-1. )next[j]= -1 意义:模式串T中下标为j的字符,假设与首字符 同样,且 ...
- Android短信监听(二)——利用ContentObserver实现短信监听
MainActivity例如以下: package cc.testsmslistener; import cc.testsmslistener.SMSContentObserver.MessageLi ...
- KMP(Knuth-Morris-Pratt)算法
一.朴素匹配算法 也就是暴力匹配算法.设匹配字符串的长度为n,模式串的长度为m,在最坏情况下,朴字符串匹配算法执行时间为O((n - m + 1)m). 假设m = n / 2, 那么该算法的复杂度就 ...
- 【总结】在VirtualBox上面安装Mac的注意事项
看此文之前 http://www.crifan.com/category/work_and_job/virtual_machine/virtualbox-virtual_machine/ 此文仅仅是针 ...
- ssh-copy-id -i ~/.ssh/id_rsa.pub admin@172.17.42.66
ssh-copy-id -i ~/.ssh/id_rsa.pub admin@172.17.42.66
- WebService的相关使用
近期公司项目使用WebService ,这里简单做个总结. 事实上详细使用细节有些情况下须要改,还须要看实际情况,须要与server联调,详细沟通. 比方公司连接,非要把envelope.dotNet ...
- JSON-C 的安装与使用
下载源代码安装步骤 wget http://oss.metaparadigm.com/json-c/json-c-0.9.tar.gz tar xvf json-c-0.9.tar.gz cd jso ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- 7.MongoDB java CRUD
注意:要增加mongodb对应的jar包 package cn.toto.mongodb; import java.net.UnknownHostException; import org.bson. ...
- 服务器编程入门(10)TCP回射服务器实现 - 并发
问题聚焦: 在前面我们大概浏览了一下服务器编程需要掌握的一些知识和技术,以及架构思想. 实践,才是检验真理的唯一标准..从这节起我们将在这些技术的基础上,一步步实现以及完善一个服 ...