字典转模型对象
-
使用字典的坏处?
- 手敲字符串key,key容易写错;
- key如果写错了,编译器不会有任何警告和报错,造成设错数据或者取错数据;
- 不面向对象。
-
使用对象的好处?
- 面向对象,对象把现实世界中的内容抽象到程序的世界,更直观,更接近人类的语言;
- 所谓模型,其实就是数据模型,专门用来存放数据的对象,用它来表示数据会更加专业;
- 模型设置数据和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错;
- 保证了数据的正确性,使用模型访问属性时,编译器会提供一系列的提示,提高编码效率。
-
字典转模型对象的使用?
- 创建模型类,封装字典转模型对象;
- 懒加载模型数据。
@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?
- storyboard用来描述软件界面,相对于xib比较重量级,一个storyboard可以有多个场景,可以用来描述整个软件的所有界面;
- xib一般用来描述一个软件界面中的某一个部分;
- 查看xib和storyboard的xml代码发现它们的区别仅仅是xib少了场景和控制器;
- xib和storyboard都用Interface Builder工具来编辑,都使用xml来存储对界面的描述,然后加载描述,创建出来。
-
使用xib封装一个自定义view的步骤?
- 新建一个继承自UIView的自定义view,类名LNAppInfoView;
- 创建xib文件(xib文件的名字和自定义view的名字一样LNAppInfoView),来描述LNAppInfoView的内部结构;
- 修改xib中的UIView的自定义类
Custom Class
为LNAppInfoView; - 把xib中的控件连线到LNAppInfoView中;
- LNAppInfoView提供一个模型属性;
- 重写模型属性的setter方法,在set方法中给xib中对应的子控件赋值;
- 写一个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的好处?
- 为了减少控制器和xib之间的依赖,把xib内部控件的赋值给封装起来;
- 如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部的子控件的创建屏蔽起来,不让外界关心,这样不管view内部怎么变化外界都不需要知道;
- 外界可以传入对应的模型数据给自定义view,view拿到模型数据后给内部的子控件设置对应的数据。
网友评论