码迷,mamicode.com
首页 > 移动开发 > 详细

ios开发——实用技术篇&Pist转模型详细介绍

时间:2015-06-19 20:08:06      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

Pist转模型详细介绍

 

关于Plist转模型在iOS开发中是非常常见的,每开一一个项目或者实现一个功能都要用到它,所以今天就给大家讲讲Plist怎么转成模型数据,

前提:必须有一个Plist文件或者通过一定的方式返回的plist数据

 

一:直接加载Plist数据

技术分享

 1 //定义一个数组属性 2 @property (nonatomic, assign) NSArray *apps; 

获取Plist文件

1 //懒加载plist文件,返回一个apps数据,后面直接使用旧可以
2 -(NSArray *)apps
3 {
4     if (_apps == nil) {
5         _apps = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"iCocos.plist" ofType:nil]];
6     }
7     return _apps;
8 }

加载Plsit中的数据

 1         //取出数组中对应的数据放到一个字典里面
 2         NSDictionary *dic = self.apps[i];
 3         
 4         
 5         //创建一个UIImageView
 6         UIImageView *icon = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, iW, 50)];
 7         /**
 8          取出字典中的icon
 9         */
10          icon.image = [UIImage imageNamed:dic[@"icon"]];
11         
12         [view addSubview:icon];
13         
14         
15 
16         //创建一个Label
17         UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(icon.frame), iW, 20)];
18         /**
19          取出字典中的label
20          */
21         l.text = dic[@"label"];
22         
23         [view addSubview:l];
24         
25         
26         
27         //创建一个按钮
28         UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(l.frame), iW, 20)];
29         /**
30          取出字典中的btn
31          */
32         [btn setTitle:dic[@"btn"] forState:UIControlStateNormal];
33         
34         [view addSubview:btn];

 

 

二:使用简单的模型加载Plist数据

技术分享

 1 //定义一个数组属性 2 @property (nonatomic, assign) NSArray *apps; 

在模型中定义模型对应的属性

1 @property (nonatomic, copy) NSString *icon;
2 
3 
4 @property (nonatomic, copy) NSString *label;
5 
6 
7 @property (nonatomic, copy) NSString *btn;

模型方法

1 /**
2  模型数据方法
3  */
4 + (instancetype)messageWithDict:(NSDictionary *)dict;
5 
6 
7 - (instancetype)initWithDict:(NSDictionary *)dict;

 

模型的实现文件

 1 /**
 2  模型数据方法的实现
 3  */
 4 
 5 + (instancetype)messageWithDict:(NSDictionary *)dict
 6 {
 7     return [[self alloc] initWithDict:dict];
 8 }
 9 
10 - (instancetype)initWithDict:(NSDictionary *)dict
11 {
12     if (self = [super init]) {
13         [self setValuesForKeysWithDictionary:dict];
14     }
15     return self;
16 }

 

实用模型加载Plist文件

 1 /**
 2  模型数据的加载,返回arry以后我们就只要使用array就能使用这个模型类里面的数据也就是使用plist数据
 3  */
 4 //懒加载plist文件,返回一个apps数据,后面直接使用旧可以
 5 -(NSMutableArray *)apps
 6 {
 7     if (_apps == nil) {
 8         NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"iCocos.plist" ofType:nil]];
 9         
10         NSMutableArray *arrayApps = [NSMutableArray array];
11         
12         for (NSDictionary *dic in array) {
13             appsModel *model = [[appsModel alloc] init];
14             model.label = dic[@"label"];
15             model.btn = dic[@"btn"];
16             model.icon = dic[@"icon"];
17             
18             [arrayApps addObject:model];
19         }
20         _apps = arrayApps;
21     }
22     return _apps;
23 }

加载模型中对应的plist数据

 1    
 2         //取出数组中对应的数据放到一个字典里面
 3         appsModel *app = self.apps[i];
 4         
 5         
 6         //创建一个UIImageView
 7         UIImageView *icon = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, iW, 50)];
 8         /**
 9          取出字典中的icon
10          */
11         icon.image = [UIImage imageNamed:app.icon];
12         [view addSubview:icon];
13         
14         
15         
16         //创建一个Label
17         UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(icon.frame), iW, 20)];
18         /**
19          取出字典中的label
20          */
21         l.text = app.label;
22         [view addSubview:l];
23         
24         
25         
26         //创建一个按钮
27         UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(l.frame), iW, 20)];
28         /**
29          取出字典中的btn
30          */
31         [btn setTitle:app.btn forState:UIControlStateNormal];
32         [view addSubview:btn];

注:上面是plist中的属性和模型中定义的属性一一对应的时候的,如果不是一一对应我们就要将模型一个一个的赋值与实现

 1 - (instancetype)initWithDict:(NSDictionary *)dict
 2 {
 3     self = [super init];
 4     if (self) {
 5         self.label = dict[@"label"];
 6         self.btn = dict[@"btn"];
 7         self.icon = dict[@"icon"];
 8         
 9 //        [self setValue:dict[@"label"] forKeyPath:@"label"];
10         
11         //封装
12         [self setValuesForKeysWithDictionary:dict];
13     }
14     
15     return self;
16 }
 1 /**
 2  模型数据的加载,返回arry以后我们就只要使用array就能使用这个模型类里面的数据也就是使用plist数据
 3  */
 4 //懒加载plist文件,返回一个apps数据,后面直接使用旧可以
 5 -(NSMutableArray *)apps
 6 {
 7     if (_apps == nil) {
 8         NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"iCocos.plist" ofType:nil]];
 9         
10         NSMutableArray *arrayApps = [NSMutableArray array];
11         
12         for (NSDictionary *dic in array) {
13 //            appsModel *model = [[appsModel alloc] initWithDict:dic];
14             appsModel *model = [appsModel appsWithDict:dic];
15             
16             [arrayApps addObject:model];
17         }
18         _apps = arrayApps;
19     }
20     return _apps;
21 }

我们也可以讲加载模型的代码进行封装,这样更加简单的实现模式数据的的使用

在模型中定义并且实现一个模型封装的方法

 1 +(NSArray *)appList
 2 {
 3         NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"iCocos.plist" ofType:nil]];
 4         
 5         NSMutableArray *arrayApps = [NSMutableArray array];
 6         
 7         for (NSDictionary *dic in array) {
 8             //            appsModel *model = [[appsModel alloc] initWithDict:dic];
 9             appsModel *model = [appsModel appsWithDict:dic];
10             
11             [arrayApps addObject:model];
12     }
13     return arrayApps;
14     
15 }

实用的时候只要直接使用封装好的模型方法就可以:

 1 /**
 2  模型数据的加载,返回arry以后我们就只要使用array就能使用这个模型类里面的数据也就是使用plist数据
 3  */
 4 //懒加载plist文件,返回一个apps数据,后面直接使用旧可以
 5 -(NSArray *)apps
 6 {
 7     if (_apps == nil) {
 8 
 9         _apps = [appsModel appList];
10     }
11     return _apps;
12 }

 

三:复杂Plist转模型

有的时候我们会遇到Plist中还有更小一级的节点和属性这个时候我们就需要更复杂的模型来加载,但是实用起来并不复杂

比如Plist中海油一个friends这歌子模型

技术分享

那么我转模型的时候就可以根据plist中的数据进行处理,

首先我们一一般都是从子模型开始,我们就先定义子模型

 1 /**
 2  根据plist里面存在的子列中的数据再创建一个模型数据
 3  */
 4 
 5 /**
 6  设置子模型数据的属性
 7  */
 8 
 9 @property (nonatomic, assign) NSString *icon;
10 
11 @property (nonatomic, assign) NSString *intro;
12 
13 @property (nonatomic, assign) NSString *name;
14 
15 @property (nonatomic, assign, getter=isVip)BOOL vip;
16 
17 
18 /**
19  子模型数据的方法
20  */
21 + (instancetype)friendWithDict:(NSDictionary *)dict;
22 
23 - (instancetype)initWithDict:(NSDictionary *)dict;

子模型的实现

 1 /**
 2  子模型数据的方法de实现
 3  */
 4 
 5 + (instancetype)friendWithDict:(NSDictionary *)dict
 6 {
 7     return [[self alloc] initWithDict:dict];
 8 }
 9 
10 - (instancetype)initWithDict:(NSDictionary *)dict
11 {
12     if (self = [super init]) {
13         [self setValuesForKeysWithDictionary:dict];
14     }
15     return self;
16 }

然后就是根模型

 1 /**
 2  根据plist中的数据创建一个模型数据
 3  */
 4 
 5 /**
 6  设置模型数据的中的属性
 7  */
 8 
 9 @property (nonatomic, assign) NSArray *friends;
10 
11 @property (nonatomic, copy) NSString *name;
12 
13 @property (nonatomic, assign) NSNumber *online;
14 
15 /**
16  模型数据的方法
17  */
18 
19 + (instancetype)groupWithDict:(NSDictionary *)dict;
20 
21 
22 - (instancetype)initWithDict:(NSDictionary *)dict;

根模型的实现,这里只需要在根模型加载需要实现的子模型酒可以

 1 /**
 2  模型数据的方法的实现
 3  */
 4 
 5 + (instancetype)groupWithDict:(NSDictionary *)dict
 6 {
 7     return [[self alloc] initWithDict:dict];
 8 }
 9 
10 - (instancetype)initWithDict:(NSDictionary *)dict
11 {
12     if (self = [super init]) {
13         [self setValuesForKeysWithDictionary:dict];
14         
15         NSMutableArray *friendArray = [NSMutableArray array];
16         for (NSDictionary *dict in self.friends) {
17             FriendsPlistChildren *friend = [FriendsPlistChildren friendWithDict:dict];
18             [friendArray addObject:friend];
19         }
20         self.friends = friendArray;
21     }
22     return self;
23 }

使用模型数据,方法还是和之前一样的,不需要去处理子模型,因为我们在跟模型里面已经处理好了

 1 /**
 2  加载模型数据的方法
 3  */
 4 
 5 - (NSArray *)groups
 6 {
 7     if (_groups == nil) {
 8         NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"friends.plist" ofType:nil]];
 9         
10         NSMutableArray *groupArray = [NSMutableArray array];
11         for (NSDictionary *dict in dictArray) {
12             FirendsPlistRoot *group = [FirendsPlistRoot groupWithDict:dict];
13             [groupArray addObject:group];
14         }
15         
16         _groups = groupArray;
17     }
18     return _groups;
19 }

 

四:使用第三份库

在iOS届有一个神人不知道大家知不知道————他叫李明杰,他(MJ)不仅技术牛逼,而且对天朝iOS界的贡献也是无法用语言来形容的,如果你是老一辈的iOS开发者倒是很正常,如果你只是刚开始学习iOS或者学习iOS不久你都不知道或者没有听过这个名字那么就可以说明你真的out了,甚至说你你根本没有用心在学,关于这个神人我就不做多介绍了,如果你想知道更多,请点击www.520it.com

今天我就使用他的一个NB的框架来实现plist转模型数据,这个框架使用起来非常简单,一行代码就可以搞定你想的功能,

首先你需要去github上面下载这个框架:https://github.com/CoderMJLee/MJExtension

下载好了之后直接讲MJExtension拖到你的项目

技术分享

首先根据plist数据新建对应的模型数据

这里我一新浪微博中的小部分做测试

#import "User.h"
#import "Status.h"
#import "StatusResult.h"

 1 /**
 2  *  微博文本内容
 3  */
 4 @property (copy, nonatomic) NSString *text;
 5 
 6 /**
 7  *  微博作者
 8  */
 9 @property (strong, nonatomic) User *user;
10 
11 /**
12  *  转发的微博
13  */
14 @property (strong, nonatomic) Status *retweetedStatus;
 1 /**
 2  *  存放着某一页微博数据(里面都是Status模型)
 3  */
 4 @property (strong, nonatomic) NSMutableArray *statuses;
 5 
 6 /**
 7  *  总数
 8  */
 9 @property (assign, nonatomic) NSNumber *totalNumber;
10 
11 /**
12  *  上一页的游标
13  */
14 @property (assign, nonatomic) long long previousCursor;
15 
16 /**
17  *  下一页的游标
18  */
19 @property (assign, nonatomic) long long nextCursor;
1 /**
2  *  名称
3  */
4 @property (copy, nonatomic) NSString *name;
5 
6 /**
7  *  头像
8  */
9 @property (copy, nonatomic) NSString *icon;

下面就是证明去使用这个框架实现你想要的功能了,这里介绍了几乎你开发中需要用到的所有方法和例子,

  1 /**
  2  MJ友情提醒:
  3  1.MJExtension是一套“字典和模型之间互相转换”的轻量级框架
  4  2.MJExtension能完成的功能
  5  * 字典 --> 模型
  6  * 模型 --> 字典
  7  * 字典数组 --> 模型数组
  8  * 模型数组 --> 字典数组
  9  3.具体用法主要参考 main.m中各个函数 以及 "NSObject+MJKeyValue.h"
 10  4.希望各位大神能用得爽
 11  */
 12 
 13 #import <Foundation/Foundation.h>
 14 #import "MJExtension.h"
 15 #import "User.h"
 16 #import "Status.h"
 17 #import "StatusResult.h"
 18 
 19 /**
 20  *  简单的字典 -> 模型
 21  */
 22 void keyValues2object()
 23 {
 24     // 1.定义一个字典
 25     NSDictionary *dict = @{
 26                            @"name" : @"Jack",
 27                            @"icon" : @"lufy.png",
 28                            };
 29     
 30     // 2.将字典转为User模型
 31     User *user = [User objectWithKeyValues:dict];
 32     
 33     // 3.打印User模型的属性
 34     NSLog(@"name=%@, icon=%@", user.name, user.icon);
 35 }
 36 
 37 /**
 38  *  复杂的字典 -> 模型 (模型里面包含了模型)
 39  */
 40 void keyValues2object2()
 41 {
 42     // 1.定义一个字典
 43     NSDictionary *dict = @{
 44                            @"text" : @"是啊,今天天气确实不错!",
 45                            
 46                            @"user" : @{
 47                                    @"name" : @"Jack",
 48                                    @"icon" : @"lufy.png"
 49                                    },
 50                            
 51                            @"retweetedStatus" : @{
 52                                    @"text" : @"今天天气真不错!",
 53                                    
 54                                    @"user" : @{
 55                                            @"name" : @"Rose",
 56                                            @"icon" : @"nami.png"
 57                                            }
 58                                    }
 59                            };
 60     
 61     // 2.将字典转为Status模型
 62     Status *status = [Status objectWithKeyValues:dict];
 63     
 64     // 3.打印status的属性
 65     NSString *text = status.text;
 66     NSString *name = status.user.name;
 67     NSString *icon = status.user.icon;
 68     NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);
 69     
 70     // 4.打印status.retweetedStatus的属性
 71     NSString *text2 = status.retweetedStatus.text;
 72     NSString *name2 = status.retweetedStatus.user.name;
 73     NSString *icon2 = status.retweetedStatus.user.icon;
 74     NSLog(@"text2=%@, name2=%@, icon2=%@", text2, name2, icon2);
 75 }
 76 
 77 /**
 78  *  复杂的字典 -> 模型 (模型的数组属性里面又装着模型)
 79  */
 80 void keyValues2object3()
 81 {
 82     // 1.定义一个字典
 83     NSDictionary *dict = @{
 84                            @"statuses" : @[
 85                                    @{
 86                                        @"text" : @"今天天气真不错!",
 87                                        
 88                                        @"user" : @{
 89                                                @"name" : @"Rose",
 90                                                @"icon" : @"nami.png"
 91                                                }
 92                                        },
 93                                    
 94                                    @{
 95                                        @"text" : @"明天去旅游了",
 96                                        
 97                                        @"user" : @{
 98                                                @"name" : @"Jack",
 99                                                @"icon" : @"lufy.png"
100                                                }
101                                        },
102                                    
103                                    @{
104                                        @"text" : @"嘿嘿,这东西不错哦!",
105                                        
106                                        @"user" : @{
107                                                @"name" : @"Jim",
108                                                @"icon" : @"zero.png"
109                                                }
110                                        }
111                                    
112                                    ],
113                            
114                            @"totalNumber" : @"2014",
115                            
116                            @"previousCursor" : @"13476589",
117                            
118                            @"nextCursor" : @"13476599"
119                            };
120     
121     // 2.将字典转为StatusResult模型
122     StatusResult *result = [StatusResult objectWithKeyValues:dict];
123     
124     // 3.打印StatusResult模型的简单属性
125     NSLog(@"totalNumber=%d, previousCursor=%lld, nextCursor=%lld", result.totalNumber, result.previousCursor, result.nextCursor);
126     
127     // 4.打印statuses数组中的模型属性
128     for (Status *status in result.statuses) {
129         NSString *text = status.text;
130         NSString *name = status.user.name;
131         NSString *icon = status.user.icon;
132         NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);
133     }
134 }
135 
136 /**
137  *  字典数组 -> 模型数组
138  */
139 void keyValuesArray2objectArray()
140 {
141     // 1.定义一个字典数组
142     NSArray *dictArray = @[
143                            @{
144                                @"name" : @"Jack",
145                                @"icon" : @"lufy.png",
146                                },
147                            
148                            @{
149                                @"name" : @"Rose",
150                                @"icon" : @"nami.png",
151                                },
152                            
153                            @{
154                                @"name" : @"Jim",
155                                @"icon" : @"zero.png",
156                                }
157                            ];
158     
159     // 2.将字典数组转为User模型数组
160     NSArray *userArray = [User objectArrayWithKeyValuesArray:dictArray];
161     
162     // 3.打印userArray数组中的User模型属性
163     for (User *user in userArray) {
164         NSLog(@"name=%@, icon=%@", user.name, user.icon);
165     }
166 }
167 
168 /**
169  *  模型 -> 字典
170  */
171 void object2keyValues()
172 {
173     // 1.新建模型
174     User *user = [[User alloc] init];
175     user.name = @"Jack";
176     user.icon = @"lufy.png";
177     
178     Status *status = [[Status alloc] init];
179     status.user = user;
180     status.text = @"今天的心情不错!";
181     
182     // 2.将模型转为字典
183     //    NSDictionary *dict = [status keyValues];
184     NSDictionary *dict = status.keyValues;
185     NSLog(@"%@", dict);
186 }
187 
188 /**
189  *  模型数组 -> 字典数组
190  */
191 void objectArray2keyValuesArray()
192 {
193     // 1.新建模型数组
194     User *user1 = [[User alloc] init];
195     user1.name = @"Jack";
196     user1.icon = @"lufy.png";
197     
198     User *user2 = [[User alloc] init];
199     user2.name = @"Rose";
200     user2.icon = @"nami.png";
201     
202     User *user3 = [[User alloc] init];
203     user3.name = @"Jim";
204     user3.icon = @"zero.png";
205     
206     NSArray *userArray = @[user1, user2, user3];
207     
208     // 2.将模型数组转为字典数组
209     NSArray *dictArray = [User keyValuesArrayWithObjectArray:userArray];
210     NSLog(@"%@", dictArray);
211 }
212 
213 int main(int argc, const char * argv[])
214 {
215     @autoreleasepool {
216         // 简单的字典 -> 模型
217         keyValues2object();
218         
219         // 复杂的字典 -> 模型 (模型里面包含了模型)
220         keyValues2object2();
221         
222         // 复杂的字典 -> 模型 (模型的数组属性里面又装着模型)
223         keyValues2object3();
224         
225         // 字典数组 -> 模型数组
226         keyValuesArray2objectArray();
227         
228         // 模型转字典
229         object2keyValues();
230         
231         // 模型数组 -> 字典数组
232         objectArray2keyValuesArray();
233     }
234     return 0;
235 }

 

 
 
 
 

ios开发——实用技术篇&Pist转模型详细介绍

标签:

原文地址:http://www.cnblogs.com/iCocos/p/4589560.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!