UI基础控件入门2

字典转模型对象

  • 使用字典的坏处?

    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)