UI基础-图片浏览器-改进5

  上篇文章,我们介绍了使用plist文件加载字典数据,用字典来存储数据,用键值对来存储数据,是NSDictionary类型(坏处:容易写错,不容易调试)

  我们可以使用模型来存储数据,也就是将要说的字典转模型.

字典转模型:

  字典:用来存储数据,用键值对来存储数据,是NSDictionary类型(坏处:容易写错,不容易调试)
  模型:用来存储数据,用属性来存储数据,好处:(有提示,不容易写错)
  字典转化成模型:一个字典转换成一个模型,把字典的键值对转换的模型的属性
  模型的建立:模型是一个纯洁的object对象,里面放着是属性,属性的类型和名称有字典中的键值对的key确定,key值类型是什么类型模型中属性就是什么类型,key值的名字是什么模型的        的名字就是什么
  转化过程:把字典中的键值对中的value值赋值给模型中的属性

  通过用for循环遍历字典数组,把每一个字典中的键值对转换成模型的属性。

  字典转模型的好处:

(1)降低代码的耦合度

(2)所有字典转模型部分的代码统一集中在一处处理,降低代码出错的几率

(3)在程序中直接使用模型的属性操作,提高编码效率

(4)调用方不用关心模型内部的任何处理细节

字典转模型的注意点:

模型应该提供一个可以传入字典参数的构造方法

- (instancetype)initWithDict:(NSDictionary *)dict;

+ (instancetype)xxxWithDict:(NSDictionary *)dict;

提示:在模型中合理地使用只读属性,可以进一步降低代码的耦合度。

附上改进后的源码:

  KZApp.h

 1 //
 2 //  KZApp.h
 3 //  UI基础-02-05-12
 4 //
 5 //  Created by hukezhu on 15/5/12.
 6 //
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @interface KZApp : NSObject
12 /**
13  *  图片名称
14  */
15 @property(nonatomic,copy)NSString *icon;
16 /**
17  *  图片描述
18  */
19 @property(nonatomic,copy)NSString *desc;
20
21 /**
22  *  通过字典来初始化对象
23  *
24  *  @param dict 字典对象
25  *
26  *  @return 已经初始化完毕的模型对象
27  */
28 -(instancetype)initWithDict:(NSDictionary *)dict;
29 +(instancetype)appWithApp:(NSDictionary *)dict;
30 @end

  KZApp.m

 1 //
 2 //  KZApp.m
 3 //  UI基础-02-05-12
 4 //
 5 //  Created by hukezhu on 15/5/12.
 6 //
 7 //
 8
 9 #import "KZApp.h"
10
11 @implementation KZApp
12 //对象方法
13 -(instancetype)initWithDict:(NSDictionary *)dict{
14
15     if(self = [super init]){
16
17         //将字典的所有属性都赋值给模型
18         self.icon = dict[@"icon"];
19         self.desc = dict[@"desc"];
20     }
21     return self;
22 }
23 //类方法
24 +(instancetype)appWithApp:(NSDictionary *)dict{
25
26     return [[self alloc]initWithDict:dict];
27 }
28 @end

  ViewController.m

  1 //
  2 //  ViewController.m
  3 //  01-图片浏览器1
  4 //
  5 //  Created by hukezhu on 15/5/12.
  6 //
  7 //
  8
  9 #import "ViewController.h"
 10 #import "KZApp.h"
 11 //#define icon @"icon"
 12 //#define desc @"desc"
 13
 14 @interface ViewController ()
 15 /**  界面上最上面显示索引的label*/
 16 @property (weak, nonatomic) IBOutlet UILabel *noLabel;
 17 /**  显示图片的控件*/
 18 @property (weak, nonatomic) IBOutlet UIImageView *iconView;
 19 /**  描述图片内容的label*/
 20 @property (weak, nonatomic) IBOutlet UILabel *descLabel;
 21 /**
 22  *  左边按钮的属性,用来控制按钮的不可用状态
 23  */
 24 @property (weak, nonatomic) IBOutlet UIButton *left;
 25 /**
 26  *  右边按钮的属性,用来控制按钮的不可用状态
 27  */
 28 @property (weak, nonatomic) IBOutlet UIButton *right;
 29 /**
 30  *  索引,记录位置
 31  */
 32 @property (nonatomic ,assign)int index;
 33 /**
 34  *  存储数据的数组
 35  */
 36 @property (nonatomic,strong)NSArray *images;
 37 /**
 38  *  上一张的点击响应方法
 39  */
 40 - (IBAction)previous;
 41 /**
 42  *  下一张的点击响应方法
 43  */
 44 - (IBAction)next;
 45 @end
 46
 47 @implementation ViewController
 48
 49 - (void)viewDidLoad {
 50     [super viewDidLoad];
 51     //首先将当前计数器设置为-1,然后再调用next方法,即可显示首页面.
 52     //self.index = -1;
 53     //[self next];
 54     [self move];
 55 }
 56 //引入懒加载的概念,重写数组的get方法.当数据用到时再进行加载,好处是提高性能
 57 -(NSArray *)images{
 58
 59     //首先判断images是否存在数据,不存在则创建
 60     //注意此处不能使用self.images,因为同是get方法,会死循环
 61     if(_images == nil){
 62         //获得plist的全路径
 63         NSString *path = [[NSBundle mainBundle]pathForResource:@"images.plist" ofType:nil];
 64         //加载数组
 65         NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];
 66         //将dictarray里面的所有字典转换成模型对象,放到新的数组中
 67         NSMutableArray *array = [NSMutableArray array];
 68         for (NSDictionary *dict in dictArray) {
 69             //创建模型对象
 70             KZApp *appModel = [KZApp appWithApp:dict];
 71             //添加模型对象到数组中
 72             [array addObject:appModel];
 73         }
 74
 75         _images = array;
 76
 77
 78     }
 79     return _images;
 80 }
 81
 82
 83 //发现代码中previous和next方法中的代码基本上一样,属于重复性的,可以将其封装成一个方法
 84 - (void)move{
 85
 86     //创建一个字典,接收当前索引下的数据
 87     //NSDictionary *dict = self.images[self.index];
 88
 89     KZApp *appModel = self.images[self.index];
 90
 91     //设置noLabel的内容
 92     self.noLabel.text = [NSString stringWithFormat:@"%d/%d",self.index+1,self.images.count];
 93     //设置图片
 94     //self.iconView.image = [UIImage imageNamed:dict[icon]];
 95     self.iconView.image = [UIImage imageNamed:appModel.icon];
 96     //设置图片描述
 97     //self.descLabel.text = dict[desc];
 98     self.descLabel.text = appModel.desc;
 99
100
101
102     //设置按钮的不可用状态,当计数器为0时,左边的按钮为不可用状态
103     self.left.enabled = self.index != 0;
104     //当计数器为4时,右边的按钮为不可用状态
105     self.right.enabled = self.index != (self.images.count - 1);
106 }
107 - (IBAction)previous{
108
109     //计数器减一
110     self.index--;
111     [self move];
112 }
113 - (IBAction)next{
114     self.index++;
115     [self move];
116 }
117 @end

  至此,图片浏览器小实例就改进到此,代码肯定还有不是很好的可以改进的地方,以后再做修改.

时间: 2024-08-01 23:24:36

UI基础-图片浏览器-改进5的相关文章

UI基础-图片浏览器-改进2

继续改进上面文章中的图片浏览器小案例,将数据放到字典中. 首先了解一下,viewDidLoad方法的作用: @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } @end    在视图加载后被调用: 如果是在代码中创建的视图加载器,他将会在loadView

UI基础-图片浏览器-改进3

本篇文章再次改进图片浏览器小实例. 本篇引入"懒加载"的概念.懒加载(延迟加载),也就是在需要的时候才加载(效率高,占用内存小).所谓懒加载,也就是重写其get方法. 直接附上源码: ViewController.m 1 // 2 // ViewController.m 3 // 01-图片浏览器1 4 // 5 // Created by hukezhu on 15/5/12. 6 // 7 // 8 9 #import "ViewController.h" 10

UI基础-图片浏览器-改进4

上面文章最后引出了plist文件.下面首先介绍一下plist文件. plist全名:Property List,属性列表文件,用来存储串行化后的对象的文件.属性列表文件的扩展名为.plist ,因此通常被称为 plist文件.文件是xml格式的. Plist文件通常用于储存用户设置,也可以用于存储捆绑的信息. 下图为图片浏览器实例使用到的plist文件的截图: 我下面介绍一下plist文件的创建过程,首先在Xcode中,点击"Flie"中的New file 或者直接使用快捷键 comm

UI基础-图片浏览器-改进1

上篇文章实现了一个使用UIImageView\UILabel\UIButton实现一个综合的小的图片浏览器,虽然能实现功能,但是代码有很大的问题,这里进行第一次改进:将代码中重复性的代码进行封装,封装成一个方法,用用户点击按钮时,调用点击按钮的响应方法,这个方法中直接调用封装的这个方法. 下面直接上代码,storyboard拖线跟上篇一样,这里不再重复 ViewController.m 1 // 2 // ViewController.m 3 // 01-图片浏览器1 4 // 5 // Cre

UI基础-图片浏览器

本篇使用UIImageView\UILabel\UIButton实现一个综合的小案例. 功能分析: 点击箭头切换序号\图片\描述 如果是首张图片,左边箭头不能点击 如果是尾张图片,右边箭头不能点击 步骤分析: 搭建UI界面:两个UILabel,一个UIImageView,两个UIButton 监听按钮点击 切换序号\图片\描述 附上storyboard拖线的图片: 附上源代码: ViewController.m 1 // 2 // ViewController.m 3 // 01-图片浏览器1

IOS-UI基础-图片浏览器

图片浏览器思路 懒加载: 就是重写了数组/字典的 get方法, 到使用的时候才会去分配内存控件 - (NSArray *)dataArray { // 1. 初始化数据 if (nil == _dataArray) { _dataArray = @[ @{@"icon":@"img_01", @"title":@"显示信息1"}, @{@"icon":@"img_02", @"

ios开发-UI基础-应用管理(单纯界面)改进5-使用代理实现监听下载按钮的点击(delegate)

[注意]转载时请注明出处博客园-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 前几篇文章介绍了一个应用管理的小应用,从最开始的单纯实现功能,一步一步就行改进\封装,上篇文章是使用xib进行了优化,本篇文章使用代理实现监听下载按钮的点击. 在原来的基础上,使用代理的主要思路分析: 首先要新建一个协议 声明协议的要实现的方法(一般为optional) 声明一个遵守该协议的代理的属性 使用代理,通知其代理完成操作 在代理中的实现步骤: 遵守协议 设置代理(一般通过拖线

iOS开发UI基础—简单的浏览器查看程序

iOS开发UI基础-简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件的对象,需要添加监听方法 左边按钮 右边按钮 二.实现基本功能的程序 1 // 2 // YYViewController.m 3 // 03-图片浏览器初步 4 // 5 // Created by apple on 14-5-21. 6 // Copyright (c) 2014年 itcas

ios开发-UI基础-应用管理(单纯界面)改进2

本篇文章,通过字典转模型来改进上篇文章中的代码. 字典转模型,之前的文章已经介绍过,这里再重复一下:  字典转模型 字典:用来存储数据的,用键值对存储数据,是一个nsdictionary ,(不好处:key值容易写错) 模型: 用来存储数据的,一个字典对应一个模型,模型用属性来存储数据,是一个纯洁的object对象 @property(nonatomic,copy)NSString *name; @property(nonatomic,copy)NSString *icon; 字典转模型:一个字