IOS之UI--小实例项目--综合使用
前言:
本博文是基于前一个小实例项目:IOS之UI--小实例项目--添加商品和商品名 进行继续综合学习积累的。
内容大纲
01-综合使用01-plist的使用
02-综合使用02-模型取代字典的好处分析
03-综合使用03-字典转模型
04-综合使用04-类前缀
05-综合使用05-copy
06-综合使用06-封装字典转模型
07-综合使用07-便利构造方法
08-综合使用08-instancetype
01-综合使用01-plist的使用
- 什么是Plist文件
- 直接将数据直接写在代码里,不是一种合理的做法。如果数据经常改就要经常翻开对应的代码进行修改,造成代码扩展性低
- 因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据。如果要变动数据,直接修改数据文件即可,不用修改代码。
- 一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种"属性列表文件"的扩展名是plist,因此也称为“plist文件”。
root:根节点
要求:会用XCode创建plist文件并能使用plist文件,比如左边三角形变动方向再按+号有两种情况:1、添加父节点的子节点 2、添加键值对
3、可以直接拷贝粘贴已经有的节点
根节点是什么类型,那么这个节点下的内容就是什么类型的数据。
因为一般情况下plist文件都是在support文件下,所以可以通过NSBundle获取全路径,然后访问其plist文件,并获取数组或者字典的集合对象。在代码中就用对应的集合引用指针指向其对象即可。
plist文件不能命名为info,因为工程项目已经有info.plist,系统自带的文件。
02-综合使用02-模型取代字典的好处分析
使用字典的坏处
一般情况下,设置数据和取出数据都使用"字符串类型的key",编写这些key时,编辑器没有只能提示,需要手敲
手敲字符串key,key容易出错
使用模型的好处
所谓模型,其实就是数据模型,专门用来存放数据的对象,用它来表示数据会更专业。
模型设置数据和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错,因此,保证了数据的正确性
使用模型访问属性时,编译器会提供一系列的提示,提高编码效率。
app.name = @"Jack";
NSString *name = app.name;
- 模型的概念:
- 专门用来存储数据的对象
- 特点:
- 一般继承NSObject
- 在h文件中声明一些用来存放数据的属性
在plist文件中假如有六个对象, 那么模型就要创建六个模型对象
苹果一般推荐在模型中属性用copy
另外: 在模型属性前面添加文档注释,可以在使用对应属性的时候会提示注释意义
03-综合使用03-字典转模型

04-综合使用04-类前缀
OC开发IOS程序,每一个类最好有前缀
比如:NSString,NSArray,UIButton,AVPlayer
遇到需呀修改所有相同错误的字符串的地方

05-综合使用05-copy
涉及到深拷贝和浅拷贝
凡是遇到字符串都用copy
- 回顾:
- assign 基本数据类型、枚举、结构体等非OC对象类型
- weak OC对象类型
- strong OC对象类型,只要强引用引用着,就不会被销毁
- copy 一般用在NSString*、block类型上
那么这里综合使用中遇到的模型的属性,因为是NSString类型,所以使用copy修饰
06-综合使用06-封装字典转模型
在ViewController中的字典转模型的代码却不是特别好,如果在项目中,会不仅仅只有一个控制器对应一个试图,然后如果多个视图都要使用这个模型对象的话,那么每个控制器类中都需要重复一下字典转模型的代码:

所以需要对这段代码进行上层封装
1、提高代码的拓展性,公用性
2、将字典转模型的代码放在模型中,跟模型相关的自然应该放在模型里。
比如:字典的元素和模型的属性相关
shop.name = object[@"name"];
shop.icon = object[@"icon"];
这样会导致模型shop知道太多集合对象元素的细节,或者是知道源数据太多的细节,这样会造成如果源数据一变动,那么模型shop中的属性、控制器中的上面这段代码中的object[@"icon"];等等都会需要改动,那么这种做法是非常不好的。
如何上层封装呢?
先思考一下;
1、首先我们肯定需要在控制器创建模型对象,这样才能使用模型对象。
2、又因为字典转模型的代码细节要放在模型中。
然后我们接着分析一下数据在逻辑上的传递过程:
plist文件数据源 -> 获取数据转为集合对象 -> 集合对象转为模型对象的集合 -> 使用模型对象集合
字典转模型的过程是在第三个过程中,进一步剖析: 数组(集合对象)对象的元素 -> 数组元素的值 赋值给 模型对象的属性 -> 模型对象的集合
综上所述: 我们需要在模型中自定义构造方法,传入的参数是集合对象的元素(这里是外部数组的元素,也就是字典集合对象),然后在模型类中实现 "字典转模型" 的细节,其实就是属性获取传入的字典的值,最后把这个模型对象返回出去。 这里需要画一个代码逻辑图
注意:初始化构造方法返回值用instancetype
以下就是字典转模型的封装过程:



07-综合使用07-便利构造方法
接下来再改改,让这个模型类更好用
其实就是使用便利构造方法,也就是类工厂方法。
注意点:谁调用便利构造方法就应该返回谁,所以需要使用self,不要使用当前类名来调用初始化方法。
08-综合使用08-instancetype
初始化方法的返回用instancetype,首先instancetype不是动态数据类型,会返回确认的数据类型。 这样的话,如果用一个不符合这个数据类型的指针引用指向这个数据类型的对象的话,会报错。
instancetype的功能返回值类型检测
而id数据类型是动态数据类型,所以返回的是一个不确定数据类型的对象,那么用一个不符合实际对象的类型指针指向这个对象,编译器是不会报错的。这个不利于我们的开发。
id是用来定义变量的地方,但是instancetype是不行的。
IOS之UI--小实例项目--综合使用的更多相关文章
- IOS开发之小实例--创建一个简单的用于视频录制和回放的应用程序
前言:还是看了一下国外的入门IOS文章:<Create a Simple App for Video Recording and Playback>,主要涉及视频录制和回放的功能的基本实现 ...
- IOS开发之小实例--使用UIImagePickerController创建一个简单的相机应用程序
前言:本篇博文是本人阅读国外的IOS Programming Tutorial的一篇入门文章的学习过程总结,难度不大,因为是入门.主要是入门UIImagePickerController这个控制器,那 ...
- IOS之UI--小实例项目--添加商品和商品名(纯代码终结版)
前言:这个小实例项目是完完全全以MJ视频传授的优化方案一步一个思路从零开始敲出代码的,而且每一步都有思路,都有逻辑所以然.敲代码讲究思路,我个人不建议记忆太多东西,反正我记性很差的. 小贴士:文章末尾 ...
- OC小实例关于init方法不小心的错误
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- OC小实例关于init 方法不小心的错误
OC小实例关于init 方法不小心的错误 正视遇到的每一个错误 在一个遥控器类操控小车玩具的小实例项目中,我采用组合的方式,将遥控器拥有小汽车对象(has a)关系,而不是继承(is a)关系. 想 ...
- iOS 模仿一个小项目,总结一下里边的模块
ManoBoo: 参考链接:http://www.jianshu.com/p/fd4c46c31508 这个小的项目是参考ManoBoo的简书的,链接在上方,自己在仿做的过程中,也离不开Man ...
- IOS之UI--小实例项目--添加商品和商品名
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- iOS阶段学习第34天笔记(UI小组件 UISegment-UISlider-UIStepper-UIProgressView-UITextView介绍)
iOS学习(UI)知识点整理 一.UI小组件 1.UISegmentedControl 分段选择器 实例代码 - (void)viewDidLoad { [super viewDidLoad]; / ...
- IOS之UIImageView--小实例项目--带音效的拳皇动画
内容大纲: 1.初步工作 2.开始敲代码 3.注意 4.可能遇到的错误 5.设置音频速率在代码顺序上的注意点 带音效的拳皇动画实例项目 初步工作 1.新建一Objective-C工程之后,将需要的拳皇 ...
随机推荐
- UBUNTU上的GIT SERVER
Git是一个开源的版本控制系统,由Linus Torvalds主导,用于支持Linux内核开发.每一个Git工作目录,都是一个完整的代码库,包含所有的提交历史.有能力跟踪所有的代码版本,而不会去依赖于 ...
- 笔试测试开发题三道(python)
笔试遇到的三道测试开发题,虽然都不难,但关键还是思路吧!我想在开发东西的时候应该具备的就是思路,有了思路尝试去写,或查相关文档或代码,在此基础上需要不断调整最终达到需求.思路又是在不断练习中获得的. ...
- Linux - 获取Shell命令帮助信息
Manual Page Chapter List 1:所有用户可以操作的指令或可执行文件 2:系统核心调用的函数与工具 3:子调用,常用的函数与函数库 4:设备,硬件文件说明,通常是/dev/的文件 ...
- JS&CSS文件请求合并及压缩处理研究(一)
在我们日常的网站开发工作中,一个页面难免会引用到各种样式及脚本文件.了解Web开发的朋友们都知道,页面引用的每一个: <link href="style.css" rel=& ...
- js-条件语句、循环语句
一. 常见条件语句 if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if... ...
- Res_Orders_01之需求分析
Res_Orders_01之需求分析 一.背景及好处 为了提高餐厅的运营效率,增强餐厅各部门间的配合,减少顾客到店后的点餐.等餐及结算过程消耗的时间,降低服务员点餐失误率,进一步提高餐厅管理人员对菜品 ...
- Sql Server来龙去脉系列之四 数据库和文件
在讨论数据库之前我们先要明白一个问题:什么是数据库? 数据库是若干对象的集合,这些对象用来控制和维护数据.一个经典的数据库实例仅仅包含少量的数据库,但用户一般也不会在一个实例上创建太多 ...
- 【iOS】编译静态库
与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图s ...
- 【JavaScript回顾】继承
组合继承 组合继承(combination inheritance),有时候也叫做伪经典继承,指的是将原型链和借用构造函数的 技术组合到一块,从而发挥二者之长的一种继承模式.其背后的思路是使用原型链实 ...
- ubuntu修改hostname
在Ubuntu系统中,快速查看主机名有多种方法:其一,打开一个GNOME终端窗口,在命令提示符中可以看到主机名,主机名通常位于“@”符号后:其二,在终端窗口中输入命令:hostname或uname – ...