iOS开发——UI基础-懒加载,plist文件,字典转模型,自定义view
一、懒加载
只有使用到了商品数组才会创建数组
保证数组只会被创建一次
只要能够保证数组在使用时才创建, 并且只会创建一次, 那么我们就称之为懒加载 lazy
- (void)viewDidLoad 控制器的view创建完毕就会调用,该方法只会调用一次
- @property (nonatomic, strong)NSArray *shops;
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- if (self.shops == nil) {
- NSLog(@"创建商品数组");
- self.shops = @[
- @{@"name":@"单肩包",
- @"icon":@"danjianbao"},
- @{@"name":@"链条包",
- @"icon":@"liantiaobao"},
- @{@"name":@"钱包",
- @"icon":@"qianbao"},
- @{@"name":@"手提包",
- @"icon":@"shoutibao"}
- ];
- }
- }
二、plist文件
向plist文件写入
- [_shops writeToFile:@"/Users/用户名/Desktop/shops.plist" atomically:YES];
- _shops = [NSArray arrayWithContentsOfFile:@"/Users/用户名/Desktop/shops.plist"];
读取plist文件
- // 1.获取plist文件的绝对路径
- NSString *path = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];
- // 2.根据路径加载plist文件
- _shops = [NSArray arrayWithContentsOfFile:path];
注意点:
在自定义plist文件的时候, 一定不能将plist文件的名称命名为info.plist, 或者xxxxinfo.plist
也就是说自定义的plist文件的名称不能包含info这个单词
三、字典转模型
废话不多说,直接上代码
- @interface ViewController ()
- @property (nonatomic, strong)NSMutableArray *shops;
- @end
- /***************模型类***************/
- @interface NJShop : NSObject
- // 商品名称
- @property(nonatomic, copy)NSString *name;
- // 商品图片
- @property(nonatomic, copy)NSString *icon;
- + (instancetype)shopWithDict:(NSDictionary *)dict;
- @end
- @implementation NJShop
- + (instancetype)shopWithDict:(NSDictionary *)dict
- {
- NJShop *shop = [[self alloc] init];
- shop.name = dict[@"name"];
- shop.icon = dict[@"icon"];
- return shop;
- }
- @end
- @implementation ViewController
- // 重写getter方法
- - (NSMutableArray *)shops
- {
- if (_shops == nil) {
- // 1.获取plist文件的绝对路径
- NSString *path = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];
- // 2.根据路径加载plist文件
- NSArray *tempArr = [NSArray arrayWithContentsOfFile:path];
- // 3.将数组中所有的字典转换为模型
- _shops = [NSMutableArray array];
- for (NSDictionary *dict in tempArr) {
- NJShop *shop = [NJShop shopWithDict:dict];
- [_shops addObject:shop];
- }
- }
- return _shops;
- }
- @end
在开发中一般不会直接从字典中获取数据
1.字典的key是一个字符串, 写错不会报错
2.英语不好, 单词记不住
3.由于key是一个字符串, 所以在编码的时候没有提示
为了解决这个问题, 我们可以使用对象来保存数据
- // 1.创建一个父控件
- UIView *containerView = [[UIView alloc] init];
- containerView.backgroundColor = [UIColor redColor];
- containerView.frame = CGRectMake(shopX, shopY, , );
- // 2.创建一张图片
- UIImageView *iv = [[UIImageView alloc] init];
- iv.frame = CGRectMake(, , , );
- // 3.创建一个文本
- UILabel *lable = [[UILabel alloc] init];
- lable.frame = CGRectMake(, , , );
- lable.textAlignment = NSTextAlignmentCenter;
- // 4.将图片和文本添加到父控件中
- [containerView addSubview:iv];
- [containerView addSubview:lable];
- // 5.设置数据
- NJShop *shop = self.shops[index];
- UIImage *image = [UIImage imageNamed:shop.icon];
- iv.image = image;
- lable.text = shop.name;
如果当前对象的作用就是用于存储数据, 那么我称这个对象为模型
四、自定义view
- @interface NJShopView : UIView
- // 数据模型
- @property(nonatomic, strong)NJShop *shop;
- @end
- @interface NJShopView ()
- // ARC中如果是strong, 对象就不会释放, 如果是weak对象会自动释放
- // strong强指针 weak弱指针
- @property(nonatomic, weak)UIImageView *iv;
- @property(nonatomic, weak)UILabel *lable;
- @end
- @implementation NJShopView
- - (instancetype)init
- {
- if (self = [super init]) {
- // 注意: 如果自定义一个View, 不建议在init方法中设置子控件的位置
- // 因为如果子控件的位置需要根据父控件的frame来计算, 在init方法中拿不到父控件的frame
- // 1.创建一张图片
- // 注意: 千万不能使用一个弱指针的属性直接保存一个控件 \
- 否则对象创建出来立刻就会被释放
- // self.iv = [[UIImageView alloc] init];
- UIImageView *iv = [[UIImageView alloc] init];
- iv.backgroundColor = [UIColor yellowColor];
- // iv.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.width);
- [self addSubview:iv];
- // 这里可以使用weak的属性保存控件的原因, 是因为在前面已经将控件添加到父控件中了\
- 只要将一个对象添加到父控件中, 那么父控件中的subViews数组就会强引用这这个控件
- self.iv = iv;
- // 2.创建一个文本
- UILabel *lable = [[UILabel alloc] init];
- lable.backgroundColor = [UIColor purpleColor];
- // lable.frame = CGRectMake(0, self.frame.size.width, self.frame.size.width, self.frame.size.height - iv.frame.size.height);
- lable.textAlignment = NSTextAlignmentCenter;
- [self addSubview:lable];
- self.lable = lable;
- }
- return self;
- }
- // layoutSubviews方法是专门用于布局子控件的位置的
- // 注意: 重写layoutSubviews方法, 一定要调用[super layoutSubviews]方法 \
- 如果不调用, 会出现一些奇葩的错误
- - (void)layoutSubviews
- {
- [super layoutSubviews];
- CGFloat shopViewWidth = self.frame.size.width;
- CGFloat shopViewHeight = self.frame.size.height;
- // 1.布局图片的位置
- self.iv.frame = CGRectMake(, , shopViewWidth, shopViewWidth);
- // 2.布局文本的位置
- self.lable.frame = CGRectMake(, shopViewWidth, shopViewWidth, shopViewHeight - self.iv.frame.size.height);
- }
- - (void)setShop:(NJShop *)shop
- {
- _shop = shop;
- // 设置子控件的数据
- self.iv.image = [UIImage imageNamed:_shop.icon];
- self.lable.text = _shop.name;
- }
- @end
- @interface ViewController ()
- // 添加方法
- - (IBAction)add;
- // 移除方法
- - (IBAction)remove;
- // 商品容器
- @property (weak, nonatomic) IBOutlet UIView *shopsView;
- @property (weak, nonatomic) IBOutlet UIButton *removeBtn;
- @property (weak, nonatomic) IBOutlet UIButton *addBtn;
- @property (nonatomic, strong)NSMutableArray *shops;
- @end
- @implementation ViewController
- - (IBAction)add
- {
- NJShopView *shopView = [[NJShopView alloc] init];
- shopView.backgroundColor = [UIColor redColor];
- // shopX, shopY
- shopView.frame = CGRectMake(shopX, shopY, , );
- [self.shopsView addSubview:shopView];
- // 设置数据
- // [shopView setShop:self.shops[index]];
- shopView.shop = self.shops[index];
- }
- // 重写getter方法
- - (NSMutableArray *)shops
- {
- if (_shops == nil) {
- NSLog(@"创建一个新的数组");
- // 1.获取plist文件的绝对路径
- NSString *path = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];
- // 2.根据路径加载plist文件
- NSArray *tempArr = [NSArray arrayWithContentsOfFile:path];
- // 3.将数组中所有的字典转换为模型
- _shops = [NSMutableArray array];
- for (NSDictionary *dict in tempArr) {
- NJShop *shop = [[NJShop alloc] init];
- shop.name = dict[@"name"];
- shop.icon = dict[@"icon"];
- [_shops addObject:shop];
- }
- }
- return _shops;
- }
- @end
iOS开发——UI基础-懒加载,plist文件,字典转模型,自定义view的更多相关文章
- iOS开发UI篇—懒加载
iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...
- iOS开发UI中懒加载的使用方法
1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载 ...
- iOS开发UI基础—手写控件,frame,center和bounds属性
iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...
- iOS开发UI篇—懒载入
iOS开发UI篇-懒载入 1.懒载入基本 懒载入--也称为延迟载入,即在须要的时候才载入(效率低,占用内存小).所谓懒载入,写的是其get方法. 注意:假设是懒载入的话则一定要注意先推断是否已经有了. ...
- iOS开发——UI基础-提示框
提示框的种类有很多,废话不多说,直接上代码 一.文本提示框 运行结果如下: 代码实现如下: @interface ViewController () // 添加方法 - (IBAction)add; ...
- IOS开发UI基础--数据刷新
IOS开发UI基础--数据刷新 cell的数据刷新包括下面几个方面 加入数据 删除数据 更改数据 全局刷新方法(最经常使用) [self.tableView reloadData]; // 屏幕上的全 ...
- iOSUI基础——懒加载
1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 ...
- UI篇—懒加载
1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 ...
- IOS开发UI基础之Plis文件-字典转模型
什么是plist文件? 在开发中直接将数据写在代码里面 不是一种合理的做法 如果数据经常改变 就需要经常翻开对应的代码进行修改 造成代码扩展性低 因此,可以考虑将经常变的数据放在⽂文件中进⾏行存储,程 ...
随机推荐
- w3m浏览器 for Linux
w3m是个开放源代码的文字式网页浏览器. w3m支持表格.框架.SSL连线.颜色. 如果是在适当的terminal(内核支持framebuffer)上,甚至还能显示图片. 这个软件通常尽量呈现出网页本 ...
- Arcgis 几何网络分析
ArcGIS:网络分析(转) 由于之前对网络分析的理解有很多问题,所以在网上找了一些资料,这是其中一篇我觉得比较好的,所以就整理了一下,发到网上来,留个底吧,呵呵 注:关于几何网络的建立见前面的& ...
- 重新注册iis的.NET Framework版本
说一个简单的方法,在VS2012.win7 sp1下亲测可用. 在开始菜单中找到VS 2012开发人员命令提示,然后执行命令:aspnet_regiis.exe -i 运行完成后截图如下:
- Tortoise SVN 安装界面
Tortoise SVN 安装界面 TortoiseSVN是Subversion版本控制系统的一个免费开源客户端,不需要为使用它而付费 第一步: 点击TortoiseSVN-1.6.6.17493-w ...
- redis主从复制操作
1. 33.10服务器上 启动三个redis bin/redis-server etc/redis.conf bin/redis-server etc/6380conf bin/redis-serve ...
- jquery 解析数据库中的json日期为正常的格式
//在action从后台数据库中请求获得日期以后,得到的是json格式的数据,因此要解析才能显示在前台1.在jsp页面写的代码如下:<html> <script> Date.p ...
- AspectJ基础学习之二搭建环境(转载)
AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...
- 通过Ajax方式上传文件,使用FormData进行Ajax请求
通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...
- Sublime Text 3065
Package Control安装 安装方法:https://packagecontrol.io/installation 用Package Control安装插件 1.按下Ctrl+Shift+P调 ...
- PHP站内搜索、多关键字、加亮显示
php搜索代码: 搜索以PHP100开头: SELECT * FROM teble WHERE title LIKE 'PHP100%' 搜索以PHP100结束: SELECT * FROM te ...