- plist文件
- root: 代表着存储的是什么类型的数据
如果root是array, 那么将来从文件中读取进来的就是数组 plist中的每一个item就代表着数组中的一个元素 item对应的类型, 就代表数组中每一个元素的类型
- 自定义的plist文件的名称不能包含info这个单词,因为系统配置是info.plist 获取plist文件路径
- NSString *path = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];
- root: 代表着存储的是什么类型的数据
-
字典转模型
-
原因:
-
在开发中一般不会直接从字典中获取数据
- 1.字典的key是一个字符串, 写错不会报错
- 2.英语不好, 单词记不住
- 3.由于key是一个字符串, 所以在编码的时候没有提示
-
为了解决这个问题, 我们可以使用对象来保存数据,对象的作用就是用于存储数据, 那么我称这个对象为模型
- 规律: 在开发中但凡看到字典, 一般情况下都会创建一个与之对应的模型来保存字典中的数据
- 字典数组中还有字典数组 不能使用kvc进行字典转换模型
- 一般步骤:
- 1.获取plist文件的绝对路径
- 2.根据路径加载plist文件
- 3.将数组中所有的字典转换为模型
-
-
-
自定义VIEW
- 自定义View的步骤:
- 1.重写初始化方法 (在里面进行一次性的初始化) xib :awakeFromNib 纯代码:initWithFrame
- 2.重写layoutSubviews, 在里面布局子控件
- 3.接收外界传入的数据, 重写set方法
- 注意:
- 如果自定义一个View, 不建议在init方法中设置子控件的位置 因为如果子控件的位置需要根据父控件的frame来计算, 在init方法中拿不到父控件的frame
- 注意:
- 一般情况下自定义一个控件会重写控件的initWithFrame方法, 因为用户可能通过init方法创建也可能通过initWithFrame方法创建, 为了保证无论用户通过哪一个方法创建都能添加子控件, 所以重写initWithFrame,init方法内部会调用initWithFrame
- 注意:
- 如果在类方法中创建对象, 建议使用self, 不要使用类名 如果直接使用类名,在有子类的时候由于父类已经写死了,所以就不能通过该方法创建子类对象
- layoutSubviews
- 专门用于布局子控件的位置
- 重写layoutSubviews方法, 一定要调用[super layoutSubviews]方法 如果不调用, 会出现一些奇葩的错误
- 重写模型set
- 设置子控件的数据
- 自定义View的步骤:
-
使用week保存控件的原因:
- 只要将一个对象添加到父控件中, 那么父控件中的subViews数组就会强引用这这个控件
- xib
- Xib和Storyboard一样都是用来描述界面的
- Xib是Storyboard的前身
- Xib是用于描述一个简单的界面或者一个局部的界面
- Storyboard是用于描述整体
- 拿到Xib方法
- NibName: 需要加载的xib名称 bundle: 从哪个包中查找
-
- 1.UINib *nib = [UINib nibWithNibName:@"ShopView" bundle:[NSBundle mainBundle]]; - 创建xib中描述的所有界面 NSArray *res = [nib instantiateWithOwner:nil options:nil]; [self.shopsView addSubview:res.firstObject]; 2.NSArray *res = [[NSBundle mainBundle] loadNibNamed:@"ShopView" owner:nil options:nil]; [self.shopsView addSubview:res.firstObject];
- xib加载原理:
- 1.根据custom class创建对象 JXShopView *shopView = [JXShopView alloc] init];
- 2.根据xib中的设置, 设置控件的相关属性 shopView.backgroundColor = [UIColor redColor]; shopView.frame = CGR ectMake(0, 0, 70, 100);
- 3.创建所有子控件, 并且设置子控件的属性
- UIImageView iv = [[UIImageView alloc] init];
- iv.frame = CGRectMake(0, 0, 70, 70);
- UILabel label = [[UILabel alloc] init];
- label.frame = CGRectMake(0, 70, 70, 30);
- 4.检查子控件是否有连线, 如果有就进行关联 self.iconView = iv; self.nameLabel = label;
- 5.将所有子控件添加到父控件中 [shopView addSubview:iv]; [shopView addSubview:label];
- 注意:
- 如果是通过xib或者Storyboard创建一个控件, 不会调用initWithFrame方法
- 如果是通过xib或者Storyboard创建一个控件,在"创建时"会调用initWithCoder方法,调用该方法时, 控件不一定被创建好
- 如果是通过xib或者Storyboard创建一个控件,在"创建后"会调用awakeFromNib,调用该方法时, 证明控件已经创建好了