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

A.需求

1.使用汽车品牌名称头字母为一个Model,汽车品牌为一个Model,头字母Model嵌套品牌Model

2.使用KVC进行Model封装赋值

3.展示头字母标题

4.展示索引(使用KVC代替遍历取出所有索引值)

B.实现

1.Model嵌套

其实就是将另一个Model作为成员

.plist 文件结构

GroupCar中有存储Car的数组

1 @property(nonatomic, strong) NSArray *cars;

封装Model的时候需要进行相应处理

CarGroup.m

1         // 这里不能用KVC,封装car model再放到array中,不能直接存储array
2         NSArray *carsArray = dictionary[@"cars"];
3         NSMutableArray *mcarsArray = [NSMutableArray array];
4         for (NSDictionary *dict in carsArray) {
5             Car *car = [Car carWithDictionary:dict];
6             [mcarsArray addObject:car];
7         }
8
9         self.cars = mcarsArray;

2.KVC

成员名使用和从dictionary取出来的键名一致,从而能用一个方法赋值所有成员属性,所见代码量

 1 Car.m
 2 - (instancetype) initWithDictionary:(NSDictionary *) dictionary {
 3     if (self = [super init]) {
 4         // 当dictionary中的键名跟Model中的成员名一致的时候,可以使用KVC
 5         [self setValuesForKeysWithDictionary:dictionary];
 6
 7 //        self.icon = dictionary[@"icon"];
 8 //        self.name = dictionary[@"name"];
 9     }
10
11     return self;
12 }
13  

3.展示标题 setTitle

1 /** 设置section头部标题 */
2 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

4.索引

1 /** 索引 */
2 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
3     // 使用KVC取出数组,不用使用遍历封装
4     return [self.carGroups valueForKey:@"title"];
5 }

C.主要代码

 1 //
 2 //  Car.h
 3 //  CarGroup
 4 //
 5 //  Created by hellovoidworld on 14/12/2.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @interface Car : NSObject
12
13 @property(nonatomic, copy) NSString *icon;
14 @property(nonatomic, copy) NSString *name;
15
16 - (instancetype) initWithDictionary:(NSDictionary *) dictionary;
17 + (instancetype) carWithDictionary:(NSDictionary *) dictionary;
18 + (instancetype) car;
19
20 @end
 1 //
 2 //  Car.m
 3 //  CarGroup
 4 //
 5 //  Created by hellovoidworld on 14/12/2.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "Car.h"
10
11 @implementation Car
12
13 - (instancetype) initWithDictionary:(NSDictionary *) dictionary {
14     if (self = [super init]) {
15         // 当dictionary中的键名跟Model中的成员名一致的时候,可以使用KVC
16         [self setValuesForKeysWithDictionary:dictionary];
17
18 //        self.icon = dictionary[@"icon"];
19 //        self.name = dictionary[@"name"];
20     }
21
22     return self;
23 }
24
25 + (instancetype) carWithDictionary:(NSDictionary *) dictionary {
26     return [[self alloc] initWithDictionary:dictionary];
27 }
28
29 + (instancetype) car {
30     return [self carWithDictionary:nil];
31 }
32
33 @end
 1 //
 2 //  CarGroup.h
 3 //  CarGroup
 4 //
 5 //  Created by hellovoidworld on 14/12/2.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @interface CarGroup : NSObject
12
13 @property(nonatomic, strong) NSArray *cars;
14 @property(nonatomic, copy) NSString *title;
15
16 - (instancetype) initWithDictionary:(NSDictionary *) dictionary;
17 + (instancetype) carGroupWithDictionary:(NSDictionary *) dictionary;
18 + (instancetype) carGroup;
19
20 @end
 1 //
 2 //  CarGroup.m
 3 //  CarGroup
 4 //
 5 //  Created by hellovoidworld on 14/12/2.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "CarGroup.h"
10 #import "Car.h"
11
12 @implementation CarGroup
13
14 - (instancetype) initWithDictionary:(NSDictionary *) dictionary {
15     if (self = [super init]) {
16         self.title = dictionary[@"title"];
17
18         // 这里不能用KVC,封装car model再放到array中,不能直接存储array
19         NSArray *carsArray = dictionary[@"cars"];
20         NSMutableArray *mcarsArray = [NSMutableArray array];
21         for (NSDictionary *dict in carsArray) {
22             Car *car = [Car carWithDictionary:dict];
23             [mcarsArray addObject:car];
24         }
25
26         self.cars = mcarsArray;
27     }
28
29     return self;
30 }
31
32 + (instancetype) carGroupWithDictionary:(NSDictionary *) dictionary {
33     return [[self alloc] initWithDictionary:dictionary];
34 }
35
36 + (instancetype) carGroup {
37     return [self carGroupWithDictionary:nil];
38 }
39
40 @end
 1 //
 2 //  ViewController.m
 3 //  CarGroup
 4 //
 5 //  Created by hellovoidworld on 14/12/1.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "ViewController.h"
10 #import "CarGroup.h"
11 #import "Car.h"
12
13 @interface ViewController () <UITableViewDataSource>
14 @property (weak, nonatomic) IBOutlet UITableView *tableView;
15
16 // 所有的车品牌
17 @property(nonatomic, strong) NSArray *carGroups;
18
19 @end
时间: 2024-11-09 00:51:47

[iOS基础控件 - 6.4] 汽车品牌展示 Model嵌套/KVC/TableView索引的相关文章

iOS基础控件之 汽车品牌展示 Model嵌套/KVC/TableView索引

A.需求 1.使用汽车品牌名称头字母为一个Model,汽车品牌为一个Model,头字母Model嵌套品牌Model 2.使用KVC进行Model封装赋值 3.展示头字母标题 4.展示索引(使用KVC代替遍历取出所有索引值) B.实现 1.Model嵌套 其实就是将另一个Model作为成员 .plist 文件结构 GroupCar中有存储Car的数组 1 @property(nonatomic, strong) NSArray *cars; 封装Model的时候需要进行相应处理 CarGroup.

[iOS基础控件 - 6.1] 汽车品牌列表 UITableView多项显示

A.实现思路 1.拖入UITableView 2.拖曳.连线UITableView控件 3.Controller遵守UITalbeViewDataSource协议 4.设置UITableView的dataSource 5.加载数据到Model 6.从Model解析数据,显示到View上 B.实现细节 1.UITableView style (1)Grouped,成组出现,标题和尾部会被分隔开,如上图 (2)Plain C.主要代码 Car.h 1 // 2 // Car.h 3 // 01-Ca

[iOS基础控件 - 6.7.1] 微博展示 代码

Controller: 1 // 2 // ViewController.m 3 // Weibo 4 // 5 // Created by hellovoidworld on 14/12/4. 6 // Copyright (c) 2014年 hellovoidworld. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "Weibo.h" 11 #import "W

[iOS基础控件 - 4.2] 字典转模型Model

A.使用字典加载数据的缺点 1.用户自行指定key,容易出错 2.存入.取出都需要key,容易混乱 B.模型 (MVC中的model) 1.字典与模型对比: (1)字典:存储数据,通过字符串类型的key取值(容易写错,写错了key编译器不会报错) (2)模型:存储数据,自定义属性存储数据,其实就类似JavaBean,本质是数据封装 2.实现 (1)定义模型类 1 @interface App : NSObject 2 3 /** 4 copy : NSString 5 strong: 一般对象

【iOS基础控件 - 13】【Demo 】QQ好友列表TableView

A.需求 1.使用plist数据,展示类似QQ好友列表的分组.组内成员显示缩进功能 2.组名使用Header,展示箭头图标.组名.组内人数和上线人数 3.点击组名,伸展.缩回好友组 code source: B.实现步骤 1.编写MVC结构 (1)根据plist文件结构,编写model,使用嵌套型 1 // 2 // FriendGroup.h 3 // FriendsList 4 // 5 // Created by hellovoidworld on 14/12/12. 6 // Copyr

iOS基础控件UINavigationController中的传值

iOS基础控件UINavigationController中的传值,代理传值,正向传值,反向传值 #import <UIKit/UIKit.h> //声明一个协议 @protocol SendValue<NSObject> //定义一个方法 - (void)sendBtnTitle:(NSString *)title; @end @interface FirstViewController : UIViewController // 定义代理 @property (nonatomi

[iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表&quot;练习)

A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不可以再按 2.在屏幕中间弹出一个消息框,通知消息“xx已经被安装”,慢慢消失 3.消息框样式为圆角半透明 B.不使用代理模式,使用app空间组和主View之间的父子View关系 1.在主View中创建一个消息框 主View控制器:ViewController.m 1 // 创建下载成功消息框 2 CGFloat labelWid

ios基础控件之开关按钮(UISwitch)

UISwitch控件是iOS开发的基础控件,是非常简单的一个控件,因为它的方法比较少.UISwitch继承于UIControl基类,因此可以当成活动控件使用. 注意:开关状态通过它的on属性进行读取,该属性是一个BOOL属性 创建: UISwitch* mySwitch = [[ UISwitch alloc]initWithFrame:CGRectMake(0.150.0f,100.0f,0.0f,0.0f)]; 可能你会疑问为什么它的大小都设置为0?没错,它的大小你设置是无效的,系统会为你分

iOS 基础控件(下)

上篇介绍了UIButton.UILabel.UIImageView和UITextField,这篇就简短一点介绍UIScrollView和UIAlertView. UIScrollView 顾名思义也知道这个是和滚动相关的控件,在Android开发时遇到过ScrollView,当内容的尺寸超出了屏幕范围之后,用ScrollView则可以通过滚动的方式使得超出屏幕的那部分内容通过滚动的方式显示出来,在Android里面有水平的ScrollView和垂直的ScrollView,在iOS里面就只有一个S