美文网首页
UI-plist、懒加载、封装、模型

UI-plist、懒加载、封装、模型

作者: 居敬持志 | 来源:发表于2016-01-31 18:13 被阅读101次

    1、加载plist文件


    • 文件名不为 info.plist
    • 接下来通过代码来解析Plist文件中的数据
      • 获得Plist文件的全路径
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *path = [bundle pathForResource:@"shops" ofType:@"plist"];
        NSString *path = [bundle pathForResource:@"shops.plist" ofType:nil];// 如果属性为空就展示文件名。这个写法也可以
    • 加载plist文件
      _shops = [NSArray arrayWithContentsOfFile:path]
    - (void)viewDidLoad {
        // 加载plist数据
        
        // 一个NSBundle对象对应一个资源包(图片、音频、视频、plis等文件)
        // NSBundle的作用:用来访问与之对应的资源包内部的文件,可以用来获得文件的全路径
        // 项目中添加的资源都会被添加到主资源包中
        // [NSBundle mainBundle]关联的就是项目的主资源包
        NSBundle *bundle = [NSBundle mainBundle];
        
        // 利用mainBundle获得plist文件在主资源包中的全路径
        NSString *file = [bundle pathForResource:@"shops" ofType:@"plist"];
    //    NSString *file = [bundle pathForResource:@"shops.plist" ofType:nil];
        
        // 凡是参数名为File,传递的都是文件的全路径
        self.shops = [NSArray arrayWithContentsOfFile:file];
    
    }
    

    模型取代字典

    • 使用字典的坏处
      • 一般情况下,设置数据和取出数据都使用“字符串类型的key”,编写这些key时,编辑器没有智能提示,需要手敲
        dict[@"name"] = @"Jack";
        NSString *name = dict[@"name"];
      • 手敲字符串key,key容易写错
      • Key如果写错了,编译器不会有任何警告和报错,造成设错数据或者取错数据
    • 使用模型的好处
      • 所谓模型,其实就是数据模型,专门用来存放数据的对象,用它来表示数据会更加专业
      • 模型设置数据和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错,因此,保证了数据的正确性
      • 使用模型访问属性时,编译器会提供一系列的提示,提高编码效率
        app.name = @"Jack";
        NSString *name = app.name;

    字典转模型

    • 字典转模型的过程最好封装在模型内部
    • 模型应该提供一个可以传入字典参数的构造方法
    - (instancetype)initWithDict:(NSDictionary *)dict;
    + (instancetype)xxxWithDict:(NSDictionary *)dict;
    
    - (instancetype)initWithDict:(NSDictionary *)dict
    {
        if (self = [super init]) {
            self.name = dict[@"name"];
            self.icon = dict[@"icon"];
        }
        return self;
    }
    
    + (instancetype)shopWithDict:(NSDictionary *)dict
    {
        return [[self alloc] initWithDict:dict];
    }
    
    • instancetype

    • instancetype在类型表示上,跟id一样,可以表示任何对象类型

    • instancetype只能用在返回值类型上,不能像id一样用在参数类型上

    • instancetype比id多一个好处:编译器会检测instancetype的真实类型

    • 字典转模型的过程


    2、懒加载


    • 数据较大的时候
    • 上面代码写在了viewDidLoad里面,在方法中可以直接调用self.shps调用数据,但如果数据较大的而且这个界面没用到数据的时候,会出现浪费内存资源
    • 好处:调用数据的时候 才去 加载数据,而且只加载一次
    • 重写-(void) {****}方法中'获取数据'的 self.shops 的get方法→ [self shops]按⌘键查看shops 就回跳到-(NSArray)shops{}这个方法中
    - (NSArray *)shops {
        if (_shops == nil) {
            _shops = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"]];
        }
        return _shops;
    }
    

    这段代码没有写在 viewDidLoad 中,所以不回加载。用到的时候在去加载。
    if(_shops == nil){ }当加载数据的时候判断数据是否为空,为空就加载一次数据。然后返回return _shops。当再次加载数据的时候判断不为空(因为已经内存中已经加载过一次数据,是有数据状态),不为空就跳过if(_shops == nil){ }这段代码,直接return _shops

    • 懒加载数据模型
    // 加载plist数据(比较大)
    // 懒加载:用到时再去加载,而且也只加载一次
    - (NSArray *)shops
    {
        if (_shops == nil) {
            // 1、加载一个字典数组
            NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"]];
            //2、字典数组转模型数组
            NSMutableArray *shopArray = [NSMutableArray array];
            for (NSDictionary *dict in dictArray) {
                XMGShop *shop = [XMGShop shopWithDict:dict];
                [shopArray addObject:shop];
            }
            //3.赋值
            _shops = shopArray;
        }
        return _shops;
    }
    

    3、View的封装


    • 如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部子控件的创建屏蔽起来,不让外界关心
    • 外界可以传入对应的模型数据给view,view拿到模型数据后给内部的子控件设置对应的数据
    • 封装控件的基本步骤
    • 在initWithFrame:方法中添加子控件,提供便利构造方法
    • 在layoutSubviews方法中设置子控件的frame(一定要调用super的layoutSubviews)
    • 增加模型属性,在模型属性set方法中设置数据到子控件上
    • 步骤
    • 新建UIView文件
    • 重写构造方法,添加子控件代码代码1
    • 设置子控件的frame 代码2``-(void)layoutSubviews方法
    • 重写模型的set方法的模型数据代码3
    • 布置子控件-> 设置控件大小 -> 加载数据
    // 代码1  重写UIView类的 init 的构造方法
    - (instancetype)init {
      if(self = [super init]){
       // 代码 :要初始化创建的 界面
      }
      return self;
    }
    
    // 推荐使用
    - (instancetype)initWithFrame:(CRrect)frame {
      if(self = [super initWithFrame:frame]){
       // 代码 :要初始化创建的 界面
      }
      return self;
    }
    
    // 代码2 布局子控件的位置  外面尺寸发生改变的时候就会调用
    -(void)layoutSubviews {
      // 一定要写
      [super layoutSubviews];
    // 代码
    }
    
    // 代码3 模型数据
    -(void)setShop:(SXShop *)shop {
      _shop = shop
      self.nameLabel.text = shop.name;
    }
    

    相关文章

      网友评论

          本文标题:UI-plist、懒加载、封装、模型

          本文链接:https://www.haomeiwen.com/subject/awkskttx.html