一、懒加载


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

保证数组只会被创建一次

只要能够保证数组在使用时才创建, 并且只会创建一次, 那么我们就称之为懒加载 lazy

- (void)viewDidLoad 控制器的view创建完毕就会调用,该方法只会调用一次

  1. @property (nonatomic, strong)NSArray *shops;
  2.  
  3. - (void)viewDidLoad
  4. {
  5. [super viewDidLoad];
  6.  
  7. if (self.shops == nil) {
  8. NSLog(@"创建商品数组");
  9. self.shops = @[
  10. @{@"name":@"单肩包",
  11. @"icon":@"danjianbao"},
  12. @{@"name":@"链条包",
  13. @"icon":@"liantiaobao"},
  14. @{@"name":@"钱包",
  15. @"icon":@"qianbao"},
  16. @{@"name":@"手提包",
  17. @"icon":@"shoutibao"}
  18. ];
  19. }
  20. }

二、plist文件


向plist文件写入

  1. [_shops writeToFile:@"/Users/用户名/Desktop/shops.plist" atomically:YES];
  2.  
  3. _shops = [NSArray arrayWithContentsOfFile:@"/Users/用户名/Desktop/shops.plist"];

读取plist文件

  1. // 1.获取plist文件的绝对路径
  2. NSString *path = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];
  3. // 2.根据路径加载plist文件
  4. _shops = [NSArray arrayWithContentsOfFile:path];

注意点:

  在自定义plist文件的时候, 一定不能将plist文件的名称命名为info.plist, 或者xxxxinfo.plist

  也就是说自定义的plist文件的名称不能包含info这个单词

三、字典转模型


废话不多说,直接上代码

  1. @interface ViewController ()
  2. @property (nonatomic, strong)NSMutableArray *shops;
  3. @end
  4.  
  5. /***************模型类***************/
  6. @interface NJShop : NSObject
  7. // 商品名称
  8. @property(nonatomic, copy)NSString *name;
  9. // 商品图片
  10. @property(nonatomic, copy)NSString *icon;
  11.  
  12. + (instancetype)shopWithDict:(NSDictionary *)dict;
  13. @end
  14.  
  15. @implementation NJShop
  16.  
  17. + (instancetype)shopWithDict:(NSDictionary *)dict
  18. {
  19. NJShop *shop = [[self alloc] init];
  20. shop.name = dict[@"name"];
  21. shop.icon = dict[@"icon"];
  22. return shop;
  23. }
  24. @end
  25.  
  26. @implementation ViewController
  27.  
  28. // 重写getter方法
  29. - (NSMutableArray *)shops
  30. {
  31. if (_shops == nil) {
  32. // 1.获取plist文件的绝对路径
  33. NSString *path = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];
  34. // 2.根据路径加载plist文件
  35. NSArray *tempArr = [NSArray arrayWithContentsOfFile:path];
  36.  
  37. // 3.将数组中所有的字典转换为模型
  38. _shops = [NSMutableArray array];
  39. for (NSDictionary *dict in tempArr) {
  40. NJShop *shop = [NJShop shopWithDict:dict];
  41. [_shops addObject:shop];
  42. }
  43. }
  44. return _shops;
  45. }
  46. @end

在开发中一般不会直接从字典中获取数据

1.字典的key是一个字符串, 写错不会报错

2.英语不好, 单词记不住

3.由于key是一个字符串, 所以在编码的时候没有提示

为了解决这个问题, 我们可以使用对象来保存数据

  1. // 1.创建一个父控件
  2. UIView *containerView = [[UIView alloc] init];
  3. containerView.backgroundColor = [UIColor redColor];
  4. containerView.frame = CGRectMake(shopX, shopY, , );
  5.  
  6. // 2.创建一张图片
  7. UIImageView *iv = [[UIImageView alloc] init];
  8. iv.frame = CGRectMake(, , , );
  9.  
  10. // 3.创建一个文本
  11. UILabel *lable = [[UILabel alloc] init];
  12. lable.frame = CGRectMake(, , , );
  13. lable.textAlignment = NSTextAlignmentCenter;
  14.  
  15. // 4.将图片和文本添加到父控件中
  16. [containerView addSubview:iv];
  17. [containerView addSubview:lable];
  18.  
  19. // 5.设置数据
  20. NJShop *shop = self.shops[index];
  21. UIImage *image = [UIImage imageNamed:shop.icon];
  22. iv.image = image;
  23. lable.text = shop.name;

如果当前对象的作用就是用于存储数据, 那么我称这个对象为模型

四、自定义view


  1. @interface NJShopView : UIView
  2. // 数据模型
  3. @property(nonatomic, strong)NJShop *shop;
  4. @end
  5.  
  6. @interface NJShopView ()
  7. // ARC中如果是strong, 对象就不会释放, 如果是weak对象会自动释放
  8. // strong强指针 weak弱指针
  9.  
  10. @property(nonatomic, weak)UIImageView *iv;
  11.  
  12. @property(nonatomic, weak)UILabel *lable;
  13.  
  14. @end
  15.  
  16. @implementation NJShopView
  17.  
  18. - (instancetype)init
  19. {
  20. if (self = [super init]) {
  21. // 注意: 如果自定义一个View, 不建议在init方法中设置子控件的位置
  22. // 因为如果子控件的位置需要根据父控件的frame来计算, 在init方法中拿不到父控件的frame
  23.  
  24. // 1.创建一张图片
  25. // 注意: 千万不能使用一个弱指针的属性直接保存一个控件 \
  26. 否则对象创建出来立刻就会被释放
  27. // self.iv = [[UIImageView alloc] init];
  28.  
  29. UIImageView *iv = [[UIImageView alloc] init];
  30. iv.backgroundColor = [UIColor yellowColor];
  31. // iv.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.width);
  32. [self addSubview:iv];
  33. // 这里可以使用weak的属性保存控件的原因, 是因为在前面已经将控件添加到父控件中了\
  34. 只要将一个对象添加到父控件中, 那么父控件中的subViews数组就会强引用这这个控件
  35. self.iv = iv;
  36.  
  37. // 2.创建一个文本
  38. UILabel *lable = [[UILabel alloc] init];
  39. lable.backgroundColor = [UIColor purpleColor];
  40. // lable.frame = CGRectMake(0, self.frame.size.width, self.frame.size.width, self.frame.size.height - iv.frame.size.height);
  41. lable.textAlignment = NSTextAlignmentCenter;
  42. [self addSubview:lable];
  43. self.lable = lable;
  44. }
  45. return self;
  46. }
  47.  
  48. // layoutSubviews方法是专门用于布局子控件的位置的
  49. // 注意: 重写layoutSubviews方法, 一定要调用[super layoutSubviews]方法 \
  50. 如果不调用, 会出现一些奇葩的错误
  51. - (void)layoutSubviews
  52. {
  53. [super layoutSubviews];
  54.  
  55. CGFloat shopViewWidth = self.frame.size.width;
  56. CGFloat shopViewHeight = self.frame.size.height;
  57. // 1.布局图片的位置
  58. self.iv.frame = CGRectMake(, , shopViewWidth, shopViewWidth);
  59. // 2.布局文本的位置
  60. self.lable.frame = CGRectMake(, shopViewWidth, shopViewWidth, shopViewHeight - self.iv.frame.size.height);
  61. }
  62.  
  63. - (void)setShop:(NJShop *)shop
  64. {
  65. _shop = shop;
  66.  
  67. // 设置子控件的数据
  68. self.iv.image = [UIImage imageNamed:_shop.icon];
  69. self.lable.text = _shop.name;
  70. }
  71. @end
  72.  
  73. @interface ViewController ()
  74. // 添加方法
  75. - (IBAction)add;
  76. // 移除方法
  77. - (IBAction)remove;
  78. // 商品容器
  79. @property (weak, nonatomic) IBOutlet UIView *shopsView;
  80.  
  81. @property (weak, nonatomic) IBOutlet UIButton *removeBtn;
  82. @property (weak, nonatomic) IBOutlet UIButton *addBtn;
  83.  
  84. @property (nonatomic, strong)NSMutableArray *shops;
  85. @end
  86.  
  87. @implementation ViewController
  88.  
  89. - (IBAction)add
  90. {
  91. NJShopView *shopView = [[NJShopView alloc] init];
  92. shopView.backgroundColor = [UIColor redColor];
  93. // shopX, shopY
  94. shopView.frame = CGRectMake(shopX, shopY, , );
  95. [self.shopsView addSubview:shopView];
  96.  
  97. // 设置数据
  98. // [shopView setShop:self.shops[index]];
  99. shopView.shop = self.shops[index];
  100. }
  101.  
  102. // 重写getter方法
  103. - (NSMutableArray *)shops
  104. {
  105. if (_shops == nil) {
  106. NSLog(@"创建一个新的数组");
  107. // 1.获取plist文件的绝对路径
  108. NSString *path = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];
  109. // 2.根据路径加载plist文件
  110. NSArray *tempArr = [NSArray arrayWithContentsOfFile:path];
  111.  
  112. // 3.将数组中所有的字典转换为模型
  113. _shops = [NSMutableArray array];
  114. for (NSDictionary *dict in tempArr) {
  115. NJShop *shop = [[NJShop alloc] init];
  116. shop.name = dict[@"name"];
  117. shop.icon = dict[@"icon"];
  118. [_shops addObject:shop];
  119. }
  120.  
  121. }
  122. return _shops;
  123. }
  124. @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. w3m浏览器 for Linux

    w3m是个开放源代码的文字式网页浏览器. w3m支持表格.框架.SSL连线.颜色. 如果是在适当的terminal(内核支持framebuffer)上,甚至还能显示图片. 这个软件通常尽量呈现出网页本 ...

  2. Arcgis 几何网络分析

    ArcGIS:网络分析(转)   由于之前对网络分析的理解有很多问题,所以在网上找了一些资料,这是其中一篇我觉得比较好的,所以就整理了一下,发到网上来,留个底吧,呵呵 注:关于几何网络的建立见前面的& ...

  3. 重新注册iis的.NET Framework版本

    说一个简单的方法,在VS2012.win7 sp1下亲测可用. 在开始菜单中找到VS 2012开发人员命令提示,然后执行命令:aspnet_regiis.exe -i 运行完成后截图如下:

  4. Tortoise SVN 安装界面

    Tortoise SVN 安装界面 TortoiseSVN是Subversion版本控制系统的一个免费开源客户端,不需要为使用它而付费 第一步: 点击TortoiseSVN-1.6.6.17493-w ...

  5. redis主从复制操作

    1. 33.10服务器上 启动三个redis bin/redis-server etc/redis.conf bin/redis-server etc/6380conf bin/redis-serve ...

  6. jquery 解析数据库中的json日期为正常的格式

    //在action从后台数据库中请求获得日期以后,得到的是json格式的数据,因此要解析才能显示在前台1.在jsp页面写的代码如下:<html> <script> Date.p ...

  7. AspectJ基础学习之二搭建环境(转载)

    AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...

  8. 通过Ajax方式上传文件,使用FormData进行Ajax请求

    通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...

  9. Sublime Text 3065

    Package Control安装 安装方法:https://packagecontrol.io/installation 用Package Control安装插件 1.按下Ctrl+Shift+P调 ...

  10. PHP站内搜索、多关键字、加亮显示

    php搜索代码: 搜索以PHP100开头: SELECT * FROM teble WHERE title  LIKE  'PHP100%' 搜索以PHP100结束: SELECT * FROM te ...