对于多组数据,可能会用到模型的嵌套。

例如多组汽车,每组是一个模型,组内有多辆车的信息,每辆车的信息也是一个模型,相当于模型中有模型。

可以看到,每个item是一个字典,这要创建一个模型,而模型内部的cars数组中每一个元素又是一个字典,即还需要一个模型。

Tip:命名的时候,关于描述的不要写description,否则会把系统的这个方法覆盖,一般是写desc。

取出一个模型数组中的所有某成员(key)值的方法:

假如group是一个模型,那么[group valueForKeyPath:@"title"] 表示找出group的title的值。

如果groups是一个模型数组,那么[group valueForKeyPath:@"title"] 表示把数组中每一个元素的title找到,并装入一个数组返回。

(KVC,Key-Value-Coding)valueForKey与valueForKeyPath的区别:前者只能取直接属性,不能取间接属性,例如group中有title,两者都可以取,groups没有title属性,只有valueForKeyPath方法才能进入group取到title,因此应该多用valueForKeyPath。

关键细节:

Car模型的实现:

@interface Car : NSObject
/**
* 名称
*/
@property (nonatomic, copy) NSString *name; /**
* 图标
*/
@property (nonatomic, copy) NSString *icon; + (instancetype)carWithDict:(NSDictionary *)dict;
- (instancetype)initWithDict:(NSDictionary *)dict; @end

@implementation Car

+ (instancetype)carWithDict:(NSDictionary *)dict{
return [[self alloc] initWithDict:dict];
}
- (instancetype)initWithDict:(NSDictionary *)dict{ if (self = [super init]) {
[self setValuesForKeysWithDictionary:dict];
}
return self; } @end

CarGroup的实现:注意模型内有模型的时候,这个外层模型的初始化方法不能再简单的用KVC来实现,因为KVC得到的是字典,应该手动取出该字典,生成car模型后再装回去,否则成员变量cars里面装的会是字典而不是模型。

@interface CarGroup : NSObject
/**
* 组标题
*/
@property (nonatomic, copy) NSString *title; /**
* 存放所有汽车品牌,装的是车的数据模型。
*/
@property (nonatomic, strong) NSArray *cars; + (instancetype)groupWithDict:(NSDictionary *)dict;
- (instancetype)initWithDict:(NSDictionary *)dict; @end
@implementation CarGroup

+ (instancetype)groupWithDict:(NSDictionary *)dict{
return [[self alloc] initWithDict:dict];
}
- (instancetype)initWithDict:(NSDictionary *)dict{ if (self = [super init]) {
//取出汽车的字典数组
NSArray *dictArray = dict[@"cars"];
NSMutableArray *carArray = [NSMutableArray array];
for (NSDictionary *dict in dictArray) {
Car *car = [[Car alloc] initWithDict:dict];
[carArray addObject:car];
}
self.cars = carArray;
self.title = dict[@"title"];
} return self;
} @end

在控制器里将所有组声明为groups,然后通过懒加载初始化。

这里的一个新知识是在TableView上增加右侧的索引,使用如下的方法:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
return [self.groups valueForKeyPath:@"title"];
}

可以看到要返回的是字符串数组,为了得到groups中的每一个group的title,使用KVC的valueForKeyPath属性间接取得所有title的值并且生成一个字符串数组返回。

索引的跳转和字符串无关,字符串数组的index和组号对应,点击对应的字符串会跳去当前index所在的组号的组。

(十八)TableView实践(多组汽车品牌展示)的更多相关文章

  1. [iOS基础控件 - 6.4] 汽车品牌展示 Model嵌套/KVC/TableView索引

    A.需求 1.使用汽车品牌名称头字母为一个Model,汽车品牌为一个Model,头字母Model嵌套品牌Model 2.使用KVC进行Model封装赋值 3.展示头字母标题 4.展示索引(使用KVC代 ...

  2. ios 汽车品牌展示案例

    汽车组模型 // ZQRGroup.h #import <Foundation/Foundation.h> @interface ZQRGroup : NSObject /** *组标题 ...

  3. 第七十八篇:写一个按需展示的文本框和按钮(使用ref)

    好家伙, 我们又又又来了一个客户 用户说: 我想我的页面上有一个搜索框, 当我不需要他的时候,它就是一个按钮 当我想要搜索的时候,我就点一下它, 然后按钮消失,搜索框出现, 当我在浏览其他东西时,这个 ...

  4. netty源码分析(十八)Netty底层架构系统总结与应用实践

    一个EventLoopGroup当中会包含一个或多个EventLoop. 一个EventLoop在它的整个生命周期当中都只会与唯一一个Thread进行绑定. 所有由EventLoop所处理的各种I/O ...

  5. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  6. Laravel 的十八个最佳实践

    本文翻译改编自 Laravel 的十八个最佳实践 这篇文章并不是什么由 Laravel 改编的 SOLID 原则.模式等. 只是为了让你注意你在现实生活的 Laravel 项目中最常忽略的内容.   ...

  7. Redis进阶实践之十八 使用管道模式提高Redis查询的速度

    原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言             学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中 ...

  8. VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器

    VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器 View 传输服务器用于管理和简化数据中心与在最终用户本地系统上检出使用的 View 桌面之间的数据传输.必须安 ...

  9. 任务三十八:UI组件之排序表格

    任务三十八:UI组件之排序表格 面向人群: 有一定JavaScript基础 难度: 低 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质 ...

随机推荐

  1. PHP AJAX 简介

    AJAX 简介 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX 是什么? AJAX = Asynchronous JavaScript and XML. AJAX ...

  2. Openstack: MP-BIOS bug: 8254 timer not connected to IO-APIC

    Issue: After you import an linux image into openstack and run an instance of it, you may find that t ...

  3. Switch控件详解

    Switch控件详解 原生效果 5.x 4.x 布局 <Switch android:id="@+id/setting_switch" android:layout_widt ...

  4. Tomcat如何实现WebSocket

    WebSocket协议属于HTML5标准,越来越多浏览器已经原生支持WebSocket,它能让客户端和服务端实现双向通信.在客户端和服务器端建立一条WebSocket连接后,服务器端消息可直接发送到客 ...

  5. Android在一个TextView里显示不同样式的字体

    在同一个TextView里显示不同样式的字体 public void setSpan(Object what, int start, int end, int flags); 样式1:背景色.粗体.字 ...

  6. 文件自动备份和同步bypy和syncthing

    http://blog.csdn.net/pipisorry/article/details/52464402 Linux定时备份数据到百度云盘 sudo pip3 install requestss ...

  7. SQL Server 执行计划操作符详解(2)——串联(Concatenation )

    本文接上文:SQL Server 执行计划操作符详解(1)--断言(Assert) 前言: 根据计划,本文开始讲述另外一个操作符串联(Concatenation),读者可以根据这个词(中英文均可)先幻 ...

  8. 集合框架之Collection接口

    Collection 层次结构中的根接口.Collection表示一组对象,这些对象也称为 collection 的元素.一些 collection 允许有重复的元素,而另一些则不允许.一些 coll ...

  9. 那些年我们一起用过的Hybrid App

    Hybrid App现状分析 Web App 毫无疑问Web App就是成本最低,最快速地解决方案了.尤其是近两年非常流行的响应式设计,Web App市场提供了非常好的实践场地.最近典型的Web Ap ...

  10. 仿淘宝购物车demo---增加和减少商品数量

    在上一篇博客中,小编简单的介绍了如何使用listview来实现购物车,但是仅仅是简单的实现了列表的功能,随之而来一个新的问题,买商品的时候,我们可能不止想买一件商品,想买多个,或许有因为某种原因点错了 ...