iOS梦工厂

iCocos——不战胜自己,何以改变未来!

数据与模型

| Comments

/******************************************************************************/

一:简单plist读取

1:定义一个数组用来保存读取出来的plist数据

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

2:使用懒加载的方式加载plist文件,并且放到数组中

// 懒加载

// 1.第一次用到时再去加载

// 2.只会加载一次

- (NSArray *)shops

{

    if (_shops == nil) {

        // 获得plist文件的全路径

        NSString *file = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];



        // 从plist文件中加载一个数组对象

        _shops = [NSArray arrayWithContentsOfFile:file];

    }

    return _shops;

}

3:使用数组中的数据

// 设置数据

1 NSDictionary *shop = self.shops[index];
2 
3 iconView.image = [UIImage imageNamed:shop[@"icon"]];
4 
5 nameLabel.text = shop[@"name"];

/******************************************************************************/

二:字典转模型

1:创建一个model类并且在里面创建对应的模型属性
/** 名字 */

 1 @property (nonatomic, strong) NSString *name; 

/** 图标 */

 1 @property (nonatomic, strong) NSString *icon; 
2:定义一个数组用来保存读取出来的plist数据
 1 @property (nonatomic, strong) NSMutableArray *shops; 
3:使用懒加载的方式加载plist文件,并且放到模型中
// 懒加载

// 1.第一次用到时再去加载

// 2.只会加载一次

- (NSMutableArray *)shops

{

    if (_shops == nil) {

        // 创建"模型数组"

        _shops = [NSMutableArray array];



        // 获得plist文件的全路径

        NSString *file = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];



        // 从plist文件中加载一个数组对象(这个数组中存放的都是NSDictionary对象)

        NSArray *dictArray = [NSArray arrayWithContentsOfFile:file];



        // 将 “字典数组” 转换为 “模型数据”

        for (NSDictionary *dict in dictArray) { // 遍历每一个字典

            // 将 “字典” 转换为 “模型”

            Shop *shop = [[Shop alloc] init];

            shop.name = dict[@"name"];

            shop.icon = dict[@"icon"];



            // 将 “模型” 添加到 “模型数组中”

            [_shops addObject:shop];

        }

    }

    return _shops;

}

4:使用模型中的数据

// 设置数据 
Shop *shop = self.shops[index];

iconView.image = [UIImage imageNamed:shop.icon];

nameLabel.text = shop.name;

/******************************************************************************/

三:字典转模型封装

1:创建一个model类并且在里面创建对应的模型属性,定义两个模型方法
/** 名字 */

@property (nonatomic, copy) NSString *name;

/** 图标 */

@property (nonatomic, copy) NSString *icon;



/** 通过一个字典来初始化模型对象 */

- (instancetype)initWithDict:(NSDictionary *)dict;



/** 通过一个字典来创建模型对象 */

+ (instancetype)shopWithDict:(NSDictionary *)dict;
2:模型方法的实现
- (instancetype)initWithDict:(NSDictionary *)dict

{

    if (self = [super init]) {

        self.name = dict[@"name"];

        self.icon = dict[@"icon"];

    }

    return self;

}



+ (instancetype)shopWithDict:(NSDictionary *)dict

{

    // 这里要用self

    return [[self alloc] initWithDict:dict];

} 
3:定义一个数组用来保存读取出来的plist数据
 1 @property (nonatomic, strong) NSMutableArray *shops; 
4:使用懒加载的方式加载plist文件,并且放到模型中
// 懒加载

// 1.第一次用到时再去加载

// 2.只会加载一次
- (NSMutableArray *)shops

{

    if (_shops == nil) {

        // 创建"模型数组"

        _shops = [NSMutableArray array];



        // 获得plist文件的全路径

        NSString *file = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];



        // 从plist文件中加载一个数组对象(这个数组中存放的都是NSDictionary对象)

        NSArray *dictArray = [NSArray arrayWithContentsOfFile:file];



        // 将 “字典数组” 转换为 “模型数据”

        for (NSDictionary *dict in dictArray) { // 遍历每一个字典

            // 将 “字典” 转换为 “模型”

            XMGShop *shop = [XMGShop shopWithDict:dict];



            // 将 “模型” 添加到 “模型数组中”

            [_shops addObject:shop];

        }

    }

    return _shops;

}
5:使用模型中的数据
// 设置数据

XMGShop *shop = self.shops[index];

iconView.image = [UIImage imageNamed:shop.icon];

nameLabel.text = shop.name;

/******************************************************************************/

四:自定义View

1:创建一个model类并且在里面创建对应的模型属性,定义两个模型方法
/** 名字 */

@property (nonatomic, copy) NSString *name;

/** 图标 */

@property (nonatomic, copy) NSString *icon;



/** 通过一个字典来初始化模型对象 */

- (instancetype)initWithDict:(NSDictionary *)dict;



/** 通过一个字典来创建模型对象 */

+ (instancetype)shopWithDict:(NSDictionary *)dict;
2:模型方法的实现
- (instancetype)initWithDict:(NSDictionary *)dict

{

    if (self = [super init]) {

        self.name = dict[@"name"];

        self.icon = dict[@"icon"];

    }

    return self;

}



+ (instancetype)shopWithDict:(NSDictionary *)dict

{

    // 这里要用self

    return [[self alloc] initWithDict:dict];

}
3:自定义一个View,引入模型类,并且创建模型类的属性
@class XMGShop;



/** 商品模型 */

@property (nonatomic, strong) XMGShop *shop;
4:实现文件中,定义相应的控件属性
/** 图片 */

@property (nonatomic, weak) UIImageView *iconView;



/** 名字 */

@property (nonatomic, weak) UILabel *nameLabel;
5:实现自定义View的相应方法
- (instancetype)init

{

    if (self = [super init]) {

        // 添加一个图片

        UIImageView *iconView = [[UIImageView alloc] init];

        [self addSubview:iconView];

        self.iconView = iconView;



        // 添加一个文字

        UILabel *nameLabel = [[UILabel alloc] init];

        nameLabel.textAlignment = NSTextAlignmentCenter;

        [self addSubview:nameLabel];

        self.nameLabel = nameLabel;

    }

    return self;

}



/**

 * 这个方法专门用来布局子控件,设置子控件的frame

 */

- (void)layoutSubviews

{

    // 一定要调用super方法

    [super layoutSubviews];



    CGFloat shopW = self.frame.size.width;

    CGFloat shopH = self.frame.size.height;



    self.iconView.frame = CGRectMake(0, 0, shopW, shopW);

    self.nameLabel.frame = CGRectMake(0, shopW, shopW, shopH - shopW);

}



-(void)setShop:(XMGShop *)shop

{

    _shop = shop;



    self.iconView.image = [UIImage imageNamed:shop.icon];

    self.nameLabel.text = shop.name;

}
6:定义一个数组用来保存读取出来的plist数据
 1 @property (nonatomic, strong) NSMutableArray *shops; 
7:使用懒加载的方式加载plist文件,并且放到模型中
// 懒加载

// 1.第一次用到时再去加载

// 2.只会加载一次

- (NSMutableArray *)shops

{

    if (_shops == nil) {

        // 创建"模型数组"

        _shops = [NSMutableArray array];



        // 获得plist文件的全路径

        NSString *file = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];



        // 从plist文件中加载一个数组对象(这个数组中存放的都是NSDictionary对象)

        NSArray *dictArray = [NSArray arrayWithContentsOfFile:file];



        // 将 “字典数组” 转换为 “模型数据”

        for (NSDictionary *dict in dictArray) { // 遍历每一个字典

            // 将 “字典” 转换为 “模型”

            XMGShop *shop = [XMGShop shopWithDict:dict];



            // 将 “模型” 添加到 “模型数组中”

            [_shops addObject:shop];

        }

    }

    return _shops;

} 
8:使用View
// 创建一个商品父控件

XMGShopView *shopView = [[XMGShopView alloc] init];

shopView.frame = CGRectMake(shopX, shopY, shopW, shopH);

// 将商品父控件添加到shopsView中

[self.shopsView addSubview:shopView];




/**



NSDictionary *dict = nil; // 从其他地方加载的字典



 XMGShop *shop = [XMGShop shopWithDict:dict];



 XMGShopView *shopView = [[XMGShopView alloc] init];

 shopView.shop = shop;

 shopView.frame = CGRectMake(0, 0, 70, 100);

 [self.view addSubview:shopView];






 // 扩展性差

 // 扩展好的体现:即使改变了需求。我们也不需要动大刀子

 */

/******************************************************************************/

五:initWithFrame

1:在上一步的基础上只要修改init方法为

/** init方法内部会自动调用initWithFrame:方法 */

- (instancetype)initWithFrame:(CGRect)frame

{

    if (self = [super initWithFrame:frame]) {

        // 添加一个图片

        UIImageView *iconView = [[UIImageView alloc] init];

        [self addSubview:iconView];

        self.iconView = iconView;



        // 添加一个文字

        UILabel *nameLabel = [[UILabel alloc] init];

        nameLabel.textAlignment = NSTextAlignmentCenter;

        [self addSubview:nameLabel];

        self.nameLabel = nameLabel;

    }

    return self;

}

2:最后设置数据的时候也可以使用下面的方法实现View的创建

 1 XMGShopView *shopView = [[XMGShopView alloc] initWithFrame:CGRectMake(shopX, shopY, shopW, shopH)]; 

/******************************************************************************/

六:MVC

1:model
@interface XMGShop : NSObject

/** 名字 */

@property (nonatomic, copy) NSString *name;

/** 图标 */

@property (nonatomic, copy) NSString *icon;

/** 通过一个字典来初始化模型对象 */

- (instancetype)initWithDict:(NSDictionary *)dict;



/** 通过一个字典来创建模型对象 */

+ (instancetype)shopWithDict:(NSDictionary *)dict;

@end






@implementation XMGShop



- (instancetype)initWithDict:(NSDictionary *)dict

{

    if (self = [super init]) {

        self.name = dict[@"name"];

        self.icon = dict[@"icon"];

    }

    return self;

}



+ (instancetype)shopWithDict:(NSDictionary *)dict

{

    // 这里要用self

    return [[self alloc] initWithDict:dict];

}



@end
2:view
@class XMGShop;



@interface XMGShopView : UIView

/** 商品模型 */

@property (nonatomic, strong) XMGShop *shop;



- (instancetype)initWithShop:(XMGShop *)shop;

+ (instancetype)shopViewWithShop:(XMGShop *)shop;

+ (instancetype)shopView;

@end






@interface XMGShopView()

/** 图片 */

@property (nonatomic, weak) UIImageView *iconView;



/** 名字 */

@property (nonatomic, weak) UILabel *nameLabel;

@end



@implementation XMGShopView



- (instancetype)initWithShop:(XMGShop *)shop

{

    if (self = [super init]) {

        self.shop = shop;

    }

    return self;

}



+ (instancetype)shopViewWithShop:(XMGShop *)shop

{

    return [[self alloc] initWithShop:shop];

}



+ (instancetype)shopView

{

    return [[self alloc] init];

}



/** init方法内部会自动调用initWithFrame:方法 */

- (instancetype)initWithFrame:(CGRect)frame

{

    if (self = [super initWithFrame:frame]) {

        // 添加一个图片

        UIImageView *iconView = [[UIImageView alloc] init];

        [self addSubview:iconView];

        self.iconView = iconView;



        // 添加一个文字

        UILabel *nameLabel = [[UILabel alloc] init];

        nameLabel.textAlignment = NSTextAlignmentCenter;

        [self addSubview:nameLabel];

        self.nameLabel = nameLabel;

    }

    return self;

}



/**

 * 当前控件的frame发生改变的时候就会调用

 * 这个方法专门用来布局子控件,设置子控件的frame

 */

- (void)layoutSubviews

{

    // 一定要调用super方法

    [super layoutSubviews];



    CGFloat shopW = self.frame.size.width;

    CGFloat shopH = self.frame.size.height;



    self.iconView.frame = CGRectMake(0, 0, shopW, shopW);

    self.nameLabel.frame = CGRectMake(0, shopW, shopW, shopH - shopW);

}



- (void)setShop:(XMGShop *)shop

{

    _shop = shop;



    self.iconView.image = [UIImage imageNamed:shop.icon];

    self.nameLabel.text = shop.name;

}



@end
controller
@property (nonatomic, strong) NSMutableArray *shops;







// 懒加载

// 1.第一次用到时再去加载

// 2.只会加载一次

- (NSMutableArray *)shops

{

    if (_shops == nil) {

        // 创建"模型数组"

        _shops = [NSMutableArray array];



        // 获得plist文件的全路径

        NSString *file = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];



        // 从plist文件中加载一个数组对象(这个数组中存放的都是NSDictionary对象)

        NSArray *dictArray = [NSArray arrayWithContentsOfFile:file];



        // 将 “字典数组” 转换为 “模型数据”

        for (NSDictionary *dict in dictArray) { // 遍历每一个字典

            // 将 “字典” 转换为 “模型”

            XMGShop *shop = [XMGShop shopWithDict:dict];



            // 将 “模型” 添加到 “模型数组中”

            [_shops addObject:shop];

        }

    }

    return _shops;

}



// 创建一个商品父控件

XMGShopView *shopView = [XMGShopView shopViewWithShop:self.shops[index]];

// 设置frame

shopView.frame = CGRectMake(shopX, shopY, shopW, shopH);

// 将商品父控件添加到shopsView中

[self.shopsView addSubview:shopView];

/******************************************************************************/

七:XIB

1:xibView中

/** 商品模型 */

@property (nonatomic, strong) XMGShop *shop;

+ (instancetype)shopViewWithShop:(XMGShop *)shop;



+ (instancetype)shopViewWithShop:(XMGShop *)shop

{

    // self == XMGShopView

    // NSStringFromClass(self) == @"XMGShopView"

    XMGShopView *shopView = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject];

    shopView.shop = shop;

    return shopView;

}



- (void)setShop:(XMGShop *)shop

{

    _shop = shop;



    UIImageView *iconView = (UIImageView *)[self viewWithTag:1];

    iconView.image = [UIImage imageNamed:shop.icon];



    UILabel *nameLabel = (UILabel *)[self viewWithTag:2];

    nameLabel.text = shop.name;

}
2:控制器中设置数据
// 从xib中加载一个商品控件

XMGShopView *shopView = [XMGShopView shopViewWithShop:self.shops[index]];

// 设置frame

shopView.frame = CGRectMake(shopX, shopY, shopW, shopH);

// 添加商品控件

[self.shopsView addSubview:shopView];

/******************************************************************************/

八:MJExtension

1:是一套“字典和模型之间互相转换”的轻量级框架,模型属性
/**

 *  微博文本内容

 */

@property (copy, nonatomic) NSString *text;



/**

 *  微博作者

 */

@property (strong, nonatomic) User *user;



/**

 *  转发的微博

 */

@property (strong, nonatomic) Status *retweetedStatus;



/**

 *  存放着某一页微博数据(里面都是Status模型)

 */

@property (strong, nonatomic) NSMutableArray *statuses;



/**

 *  总数

 */

@property (assign, nonatomic) NSNumber *totalNumber;



/**

 *  上一页的游标

 */

@property (assign, nonatomic) long long previousCursor;



/**

 *  下一页的游标

 */

@property (assign, nonatomic) long long nextCursor;





/**

 *  名称

 */

@property (copy, nonatomic) NSString *name;



/**

 *  头像

 */

@property (copy, nonatomic) NSString *icon;
2:对应方法的实现
  • 1.MJExtension是一套“字典和模型之间互相转换”的轻量级框架

  • 2.MJExtension能完成的功能

    • 字典 –> 模型

    • 模型 –> 字典

    • 字典数组 –> 模型数组

    • 模型数组 –> 字典数组

  • 3.具体用法主要参考 main.m中各个函数 以及 “NSObject+MJKeyValue.h”

  • 4.希望各位大神能用得爽

     #import <Foundation/Foundation.h>
    
     #import "MJExtension.h"
    
     #import "User.h"
    
     #import "Status.h"
    
     #import "StatusResult.h"
    
    
    
     /**
    
      *  简单的字典 -> 模型
    
      */
    
     void keyValues2object()
    
     {
    
         // 1.定义一个字典
    
         NSDictionary *dict = @{
    
                                @"name" : @"Jack",
    
                                @"icon" : @"lufy.png",
    
                                };
    
    
    
         // 2.将字典转为User模型
    
         User *user = [User objectWithKeyValues:dict];
    
    
    
         // 3.打印User模型的属性
    
         NSLog(@"name=%@, icon=%@", user.name, user.icon);
    
     }
    
    
    
     /**
    
      *  复杂的字典 -> 模型 (模型里面包含了模型)
    
      */
    
     void keyValues2object2()
    
     {
    
         // 1.定义一个字典
    
         NSDictionary *dict = @{
    
                                @"text" : @"是啊,今天天气确实不错!",
    
    
    
                                @"user" : @{
    
                                        @"name" : @"Jack",
    
                                        @"icon" : @"lufy.png"
    
                                        },
    
    
    
                                @"retweetedStatus" : @{
    
                                        @"text" : @"今天天气真不错!",
    
    
    
                                        @"user" : @{
    
                                                @"name" : @"Rose",
    
                                                @"icon" : @"nami.png"
    
                                                }
    
                                        }
    
                                };
    
    
    
         // 2.将字典转为Status模型
    
         Status *status = [Status objectWithKeyValues:dict];
    
    
    
         // 3.打印status的属性
    
         NSString *text = status.text;
    
         NSString *name = status.user.name;
    
         NSString *icon = status.user.icon;
    
         NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);
    
    
    
         // 4.打印status.retweetedStatus的属性
    
         NSString *text2 = status.retweetedStatus.text;
    
         NSString *name2 = status.retweetedStatus.user.name;
    
         NSString *icon2 = status.retweetedStatus.user.icon;
    
         NSLog(@"text2=%@, name2=%@, icon2=%@", text2, name2, icon2);
    
     }
    
    
    
     /**
    
      *  复杂的字典 -> 模型 (模型的数组属性里面又装着模型)
    
      */
    
     void keyValues2object3()
    
     {
    
         // 1.定义一个字典
    
         NSDictionary *dict = @{
    
                                @"statuses" : @[
    
                                        @{
    
                                            @"text" : @"今天天气真不错!",
    
    
    
                                            @"user" : @{
    
                                                    @"name" : @"Rose",
    
                                                    @"icon" : @"nami.png"
    
                                                    }
    
                                            },
    
    
    
                                        @{
    
                                            @"text" : @"明天去旅游了",
    
    
    
                                            @"user" : @{
    
                                                    @"name" : @"Jack",
    
                                                    @"icon" : @"lufy.png"
    
                                                    }
    
                                            },
    
    
    
                                        @{
    
                                            @"text" : @"嘿嘿,这东西不错哦!",
    
    
    
                                            @"user" : @{
    
                                                    @"name" : @"Jim",
    
                                                    @"icon" : @"zero.png"
    
                                                    }
    
                                            }
    
    
    
                                        ],
    
    
    
                                @"totalNumber" : @"2014",
    
    
    
                                @"previousCursor" : @"13476589",
    
    
    
                                @"nextCursor" : @"13476599"
    
                                };
    
    
    
         // 2.将字典转为StatusResult模型
    
         StatusResult *result = [StatusResult objectWithKeyValues:dict];
    
    
    
         // 3.打印StatusResult模型的简单属性
    
         NSLog(@"totalNumber=%d, previousCursor=%lld, nextCursor=%lld", result.totalNumber, result.previousCursor, result.nextCursor);
    
    
    
         // 4.打印statuses数组中的模型属性
    
         for (Status *status in result.statuses) {
    
             NSString *text = status.text;
    
             NSString *name = status.user.name;
    
             NSString *icon = status.user.icon;
    
             NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);
    
         }
    
     }
    
    
    
     /**
    
      *  字典数组 -> 模型数组
    
      */
    
     void keyValuesArray2objectArray()
    
     {
    
         // 1.定义一个字典数组
    
         NSArray *dictArray = @[
    
                                @{
    
                                    @"name" : @"Jack",
    
                                    @"icon" : @"lufy.png",
    
                                    },
    
    
    
                                @{
    
                                    @"name" : @"Rose",
    
                                    @"icon" : @"nami.png",
    
                                    },
    
    
    
                                @{
    
                                    @"name" : @"Jim",
    
                                    @"icon" : @"zero.png",
    
                                    }
    
                                ];
    
    
    
         // 2.将字典数组转为User模型数组
    
         NSArray *userArray = [User objectArrayWithKeyValuesArray:dictArray];
    
    
    
         // 3.打印userArray数组中的User模型属性
    
         for (User *user in userArray) {
    
             NSLog(@"name=%@, icon=%@", user.name, user.icon);
    
         }
    
     }
    
    
    
     /**
    
      *  模型 -> 字典
    
      */
    
     void object2keyValues()
    
     {
    
         // 1.新建模型
    
         User *user = [[User alloc] init];
    
         user.name = @"Jack";
    
         user.icon = @"lufy.png";
    
    
    
         Status *status = [[Status alloc] init];
    
         status.user = user;
    
         status.text = @"今天的心情不错!";
    
    
    
         // 2.将模型转为字典
    
         //    NSDictionary *dict = [status keyValues];
    
         NSDictionary *dict = status.keyValues;
    
         NSLog(@"%@", dict);
    
     }
    
    
    
     /**
    
      *  模型数组 -> 字典数组
    
      */
    
     void objectArray2keyValuesArray()
    
     {
    
         // 1.新建模型数组
    
         User *user1 = [[User alloc] init];
    
         user1.name = @"Jack";
    
         user1.icon = @"lufy.png";
    
    
    
         User *user2 = [[User alloc] init];
    
         user2.name = @"Rose";
    
         user2.icon = @"nami.png";
    
    
    
         User *user3 = [[User alloc] init];
    
         user3.name = @"Jim";
    
         user3.icon = @"zero.png";
    
    
    
         NSArray *userArray = @[user1, user2, user3];
    
    
    
         // 2.将模型数组转为字典数组
    
         NSArray *dictArray = [User keyValuesArrayWithObjectArray:userArray];
    
         NSLog(@"%@", dictArray);
    
     }
    
    
    
     int main(int argc, const char * argv[])
    
     {
    
         @autoreleasepool {
    
             // 简单的字典 -> 模型
    
             keyValues2object();
    
    
    
             // 复杂的字典 -> 模型 (模型里面包含了模型)
    
             keyValues2object2();
    
    
    
             // 复杂的字典 -> 模型 (模型的数组属性里面又装着模型)
    
             keyValues2object3();
    
    
    
             // 字典数组 -> 模型数组
    
             keyValuesArray2objectArray();
    
    
    
             // 模型转字典
    
             object2keyValues();
    
    
    
             // 模型数组 -> 字典数组
    
             objectArray2keyValuesArray();
    
         }
    
         return 0;
    
     }
    


微信号:

clpaial10201119(Q Q:2211523682)

微博WB:

http://weibo.com/u/3288975567?is_hot=1

gitHub:

https://github.com/al1020119

博客

http://al1020119.github.io/


Comments