一、懒加载


只有使用到了商品数组才会创建数组

保证数组只会被创建一次

只要能够保证数组在使用时才创建, 并且只会创建一次, 那么我们就称之为懒加载 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的更多相关文章

  1. iOS开发UI篇—懒加载

    iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...

  2. iOS开发UI中懒加载的使用方法

    1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载 ...

  3. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  4. iOS开发UI篇—懒载入

    iOS开发UI篇-懒载入 1.懒载入基本 懒载入--也称为延迟载入,即在须要的时候才载入(效率低,占用内存小).所谓懒载入,写的是其get方法. 注意:假设是懒载入的话则一定要注意先推断是否已经有了. ...

  5. iOS开发——UI基础-提示框

    提示框的种类有很多,废话不多说,直接上代码 一.文本提示框 运行结果如下: 代码实现如下: @interface ViewController () // 添加方法 - (IBAction)add; ...

  6. IOS开发UI基础--数据刷新

    IOS开发UI基础--数据刷新 cell的数据刷新包括下面几个方面 加入数据 删除数据 更改数据 全局刷新方法(最经常使用) [self.tableView reloadData]; // 屏幕上的全 ...

  7. iOSUI基础——懒加载

    1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 ...

  8. UI篇—懒加载

    1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 ...

  9. IOS开发UI基础之Plis文件-字典转模型

    什么是plist文件? 在开发中直接将数据写在代码里面 不是一种合理的做法 如果数据经常改变 就需要经常翻开对应的代码进行修改 造成代码扩展性低 因此,可以考虑将经常变的数据放在⽂文件中进⾏行存储,程 ...

随机推荐

  1. iocp还是select

    上一个项目libevent应该是select,现在libuv是iocp,都知道Windows下iocp比select效率高,boost asio 也是iocp,但具体使用select和iocp发现没有 ...

  2. C# 判断 当前设备的IP地址、默认网关、子网掩码在不在同一网段内

    要判断两个IP地址是不是在同一个网段,就将它们的IP地址分别与子网掩码做与运算,得到的结果一网络号,如果网络号相同,就在同一子网,否则,不在同一子网. 例:假定选择了子网掩码255.255.254.0 ...

  3. Linux学习笔记<四>

    <1>shutdown -h now 立刻进行关机 shutdown -r now/reboor 现在重新启动计算机 <2>尽量避免用root用户登陆,用普通用户登陆后换成ro ...

  4. HTML学习笔记——标签设置格式

    1>标签设置格式 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  5. MySQL学习笔记——函数

    常用函数 ALTER TABLE tb_emp ); #插入数据 INSERT INTO tb_dept() VALUE(,'市场部','负责市场工作'); # concat 连接 SELECT CO ...

  6. 当SVN服务器端IP地址发生变化时,客户端重新定位

    第一种方法: 重新设置URL: 第二种方法: 找到客户端数据库文件 ,在隐藏的文件夹.svn中,找到文件夹中的文件 *.db文件 ,用SQLite打开,修改表Repository中的数据

  7. yourphp问题中心

    1.前台读不出字段.数据库列表有的,但前台就适读不出来. 2.浏览次数+1与+2的问题 浏览+ <a href="{:URL('User-Register/index')}" ...

  8. -- c语言数据类型总结 --

    C语言中的数据类型总结

  9. 关于win10输入法问题(打不出中文)解决方法

    提问过windous10打不出字,通过安装第三方输入法和所有有关切换的快捷键都没用,现在找到了解决方法 win键+x,打开命令提示符,输入ctfmon,回车 这样就能看到桌面右下角的输入法上面的叉叉消 ...

  10. Spring与Quartz的整合实现定时任务调度 以及crontab的用法

    最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考. 我使用的是Maven来管理项目,需要的Jar包我给大家贴 ...