plist文件root: 代表着存储的是什么类型的数据如果root是array, 那么将来从文件中读取进来的就是数组
plist中的每一个item就代表着数组中的一个元素
item对应的类型, 就代表数组中每一个元素的类型
自定义的plist文件的名称不能包含info这个单词,因为系统配置是info.plist获取plist文件路径NSString *path = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];字典转模型
原因:
在开发中一般不会直接从字典中获取数据
1.字典的key是一个字符串, 写错不会报错2.英语不好, 单词记不住3.由于key是一个字符串, 所以在编码的时候没有提示为了解决这个问题, 我们可以使用对象来保存数据,对象的作用就是用于存储数据, 那么我称这个对象为模型
规律: 在开发中但凡看到字典, 一般情况下都会创建一个与之对应的模型来保存字典中的数据字典数组中还有字典数组 不能使用kvc进行字典转换模型一般步骤:1.获取plist文件的绝对路径2.根据路径加载plist文件3.将数组中所有的字典转换为模型自定义VIEW
自定义View的步骤:1.重写初始化方法 (在里面进行一次性的初始化) xib :awakeFromNib 纯代码:initWithFrame2.重写layoutSubviews, 在里面布局子控件3.接收外界传入的数据, 重写set方法注意:如果自定义一个View, 不建议在init方法中设置子控件的位置 因为如果子控件的位置需要根据父控件的frame来计算, 在init方法中拿不到父控件的frame注意:一般情况下自定义一个控件会重写控件的initWithFrame方法, 因为用户可能通过init方法创建也可能通过initWithFrame方法创建, 为了保证无论用户通过哪一个方法创建都能添加子控件, 所以重写initWithFrame,init方法内部会调用initWithFrame注意:如果在类方法中创建对象, 建议使用self, 不要使用类名 如果直接使用类名,在有子类的时候由于父类已经写死了,所以就不能通过该方法创建子类对象layoutSubviews专门用于布局子控件的位置重写layoutSubviews方法, 一定要调用[super layoutSubviews]方法 如果不调用, 会出现一些奇葩的错误重写模型set设置子控件的数据使用week保存控件的原因:
只要将一个对象添加到父控件中, 那么父控件中的subViews数组就会强引用这这个控件xibXib和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,调用该方法时, 证明控件已经创建好了