美文网首页UI笔记
UI基础控件入门2

UI基础控件入门2

作者: 冷漠叻荭颜 | 来源:发表于2015-03-22 19:08 被阅读224次

    字典转模型对象

    • 使用字典的坏处?

      1. 手敲字符串key,key容易写错;
      2. key如果写错了,编译器不会有任何警告和报错,造成设错数据或者取错数据;
      3. 不面向对象。
    • 使用对象的好处?

      1. 面向对象,对象把现实世界中的内容抽象到程序的世界,更直观,更接近人类的语言;
      2. 所谓模型,其实就是数据模型,专门用来存放数据的对象,用它来表示数据会更加专业;
      3. 模型设置数据和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错;
      4. 保证了数据的正确性,使用模型访问属性时,编译器会提供一系列的提示,提高编码效率。
    • 字典转模型对象的使用?

      1. 创建模型类,封装字典转模型对象;
      2. 懒加载模型数据。
    @interface LNAppInfo : NSObject
    @property (nonatomic, copy) NSString *icon;
    @property (nonatomic, copy) NSString *name;
    @end
    
    @implementation LNAppInfo
    // 构造方法初始化类内部的name和icon属性
    - (instancetype)initWithDict:(NSDictionary *)dict
    {
        if (self = [super init]) {
            [self setValuesForKeysWithDictionary:dict];
        }
        return self;
    }
    // 类方法,快速初始化类的对象
    + (instancetype)appInfoWithDict:(NSDictionary*)dict
    {
        return [[self alloc] initWithDic:dict];
    }
    // 类方法,返回数据
    + (NSArray *)appInfosList
    {
        // 1 获取当前应用的bundle
        NSBundle *bundle = [NSBundle mainBundle];
        // 2 plist文件的路径
        NSString *path = [bundle pathForResource:@"app.plist" ofType:nil];
        // 3 从plist中加载字典数组
        NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];
        // 4 存储appInfo的临时数组
        NSMutableArray *appInfos = [NSMutableArray array];
        // 5 遍历字典数组,取出每一个字典转换成模型
        for (NSDictionary *dict in dictArray) {
            //调用类方法快速初始化对象
            LNAppInfo *appInfo = [LNAppInfo appInfoWithDict:dict];
            //把模型添加到模型数组中
            [appInfos addObject:appInfo];
        }
        return appInfos;
    }
    @end
    
    // 在控制器中加载懒模型数据
    - (NSArray *)appInfos
    {
        if(_appInfos == nil) {
            _appInfos = [LNAppInfo appInfosList];
        }
    ​    return _appInfos;
    }
    

    xib的使用

    • xib和storyboard?

      1. storyboard用来描述软件界面,相对于xib比较重量级,一个storyboard可以有多个场景,可以用来描述整个软件的所有界面;
      2. xib一般用来描述一个软件界面中的某一个部分;
      3. 查看xib和storyboard的xml代码发现它们的区别仅仅是xib少了场景和控制器;
      4. xib和storyboard都用Interface Builder工具来编辑,都使用xml来存储对界面的描述,然后加载描述,创建出来。
    • 使用xib封装一个自定义view的步骤?

      1. 新建一个继承自UIView的自定义view,类名LNAppInfoView;
      2. 创建xib文件(xib文件的名字和自定义view的名字一样LNAppInfoView),来描述LNAppInfoView的内部结构;
      3. 修改xib中的UIView的自定义类Custom Class为LNAppInfoView;
      4. 把xib中的控件连线到LNAppInfoView中;
      5. LNAppInfoView提供一个模型属性;
      6. 重写模型属性的setter方法,在set方法中给xib中对应的子控件赋值;
      7. 写一个appInfoView类方法,封装加载xib创建LNAppInfoView的过程。
    @property(weak, nonatomic) IBOutlet UIImageView *iconView;
    @property(weak, nonatomic) IBOutlet UILabel *nameView;
    @property (nonatomic, strong) CZAppInfo *appInfo;
    
    + (instancetype)appInfoView
    {
        NSBundle *bundle = [NSBundle mainBundle];
        LNAppInfoView *view = [[bundle loadNibNamed:@"LNAppInfoView" owner:nil options:nil] lastObject];
        return view;
    }
    - (void)setAppInfo:(CZAppInfo *)appInfo
    {
        _appInfo = appInfo;
        self.nameView.text = appInfo.name;
        self.iconView.image = [UIImage imageNamed:appInfo.icon];
    }
    
    // 控制器改造
    // 从自定义view中加载子view
    LNAppInfoView *view = [LNAppInfoView appInfoView];
    // 取得当前遍历到的应用信息
    LNAppInfo *appInfo = self.appInfos[i];
    // 给自定义view的模型属性赋值(setter方法给自定义view内部的子控件赋值)
    view.appInfo = appInfo;
    
    • 封装xib的好处?

      1. 为了减少控制器和xib之间的依赖,把xib内部控件的赋值给封装起来;
      2. 如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部的子控件的创建屏蔽起来,不让外界关心,这样不管view内部怎么变化外界都不需要知道;
      3. 外界可以传入对应的模型数据给自定义view,view拿到模型数据后给内部的子控件设置对应的数据。

    相关文章

      网友评论

        本文标题:UI基础控件入门2

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