IOS开发UI基础之Plis文件-字典转模型
什么是plist文件?
在开发中直接将数据写在代码里面 不是一种合理的做法 如果数据经常改变 就需要经常翻开对应的代码进行修改 造成代码扩展性低
一般可以使⽤用属性列表⽂文件存储NSArray或者NSDictionary之类的数据,这 种“属性列表⽂文件”的扩展名是plist,因此也称为“plist⽂文件”
在Xcode创建plist文件的步骤:
解析plist文件
plist文件的解析过程
plist的使用注意:
plist的文件名不能叫做 “info” 、“Info” 之类的
添加plist等文件资源的时候 也就是你将一个文件拖到项目中的时候 一定要勾选下面的选项:
通过上面的讲解 相信你已经知道了 我们从plist解析出来的是一个字典 当我们要获取数据的时候 就可以直接使用字典中的key 去获取value
但是使用字典是由一定的缺陷的 :
➢ 般情况下,设置数据和取出数据都使⽤用“字符串类型的key”,编写这些key时,编辑器没有智能提⽰示,需要⼿手敲
dict[@"name"] = @"Jack"; NSString *name = dict[@"name"];
-
➢ ⼿手敲字符串key,key容易写错
-
➢ Key如果写错了,编译器不会有任何警告和报错,造成设错数据或者取错数据 ● 使⽤用模型的好处
- 所谓模型,其实就是数据模型,专门⽤用来存放数据的对象,⽤用它来表⽰示数据会更加专业
- 模型设置数据和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错,因此,保证了数据的正确性
- 使⽤用模型访问属性时,编译器会提供⼀一系列的提⽰示,提⾼高编码效率
如何字典转模型?
字典转模型的过程
字典转模型的操作最好封装在模型内部
模型应该提供⼀一个可以传⼊入字典参数的构造⽅方法
一般模型中都会提供这样两个构造方法
instancetype
● instancetype 在类型表⽰示上,跟id⼀一样,可以表⽰示任何对象类型
● instancetype只能⽤用在返回值类型上,不能像id⼀一样⽤用在参数类型上
● instancetype⽐比id多⼀一个好处:编译器会检测instancetype的真实类型
类前缀
- 使⽤用Objective-C开发iOS程序时,最好在每个类名前⾯面加⼀一个前缀,⽤用来标识这个类的“⽼老家”在哪
- ⽬目的是防⽌止N个⼈人开发了⼀一样的类,冲突了
- ⽐比如Jake Will、Kate Room在同⼀一个项⽬目中都各⾃自开发了个Button类,这样的程序是不能运⾏行起来的
- 解决⽅方案:Jake Will的类名叫做JWButton,Kate Room的类名叫做KRButton
View的封装
如果⼀一个view内部的⼦子控件⽐比较多,⼀一般会考虑⾃自定义⼀一个view,把它内部
外界可以传⼊入对应的模型数据给view,view拿到模型数据后给内部的⼦子控件 设置对应的数据
封装控件的基本步骤
在initWithFrame:⽅方法中添加⼦子控件,提供便利构造⽅方法
在layoutSubviews⽅方法中设置⼦子控件的frame(⼀一定要调⽤用super的 layoutSubviews)
增加模型属性,在模型属性set⽅方法中设置数据到⼦子控件上
Xib和storyboard对⽐
共同点:
- 都⽤用来描述软件界⾯面
- 都⽤用Interface Builder⼯工具来编辑
- 本质都是转换成代码去创建控件
不同点:
- Xib是轻量级的,⽤用来描述局部的UI界⾯面
- Storyboard是重量级的,⽤用来描述整个软件的多个界⾯面,并且能展⽰示多个界⾯面之间的跳 转关系
XIB加载的两种方式:
使⽤用xib⾃自定义view的步骤
- 新建一个自定义的控件类
- 新建xib文件 (文件名减一和view的类名一致)
- 修改xib中view的类名
- 封装xib的加载过程
- 增加模型属性 在模型属性set方法中设置数据到子控件上面
注意点:
一个控件有2种创建⽅方式
● 通过代码创建- 初始化时⼀一定会调⽤用initWithFrame:⽅方法
● 通过xib\storyboard创建
- 初始化时不会调⽤用initWithFrame:⽅方法,只会调⽤用initWithCoder:⽅方法
- 初始化完毕后会调⽤用awakeFromNib⽅方法
● 有时候希望在控件初始化时做⼀一些初始化操作,⽐比如添加⼦子控件、设置基本属性
● 这时需要根据控件的创建⽅方式,来选择在initWithFrame:、initWithCoder:、awakeFromNib的哪个⽅方法中操作
UIImage 简单介绍
一个UIImage对象代表一张图片 一般通过imageNamed:方法就可以通过文件名加载项目中的图片
如:
UILabel的基本设置
UIFont 代表字体 常见的创建方法有以下几个
UIButton、UIImageView、UILabel的选择
特点
UIButton- 既能显⽰示⽂文字,又能显⽰示图⽚片(能显⽰示2张图⽚片,背景图⽚片、内容图⽚片) - 长按⾼高亮的时候可以切换图⽚片\⽂文字
- 直接通过addTarget...⽅方法监听点击
UIImageView
- 能显⽰示图⽚片,不能直接通过addTarget...⽅方法监听点击
UILabel
- 能显⽰示⽂文字,不能直接通过addTarget...⽅方法监听点击
选择
仅仅是显⽰示数据,不需要点击 建议选择UIImageView、UILabel
不仅显⽰示数据,还需要监听点击
建议选择UIButton
其实UIImageView、UILabel也可以通过⼿手势识别器来监听(后⾯面课程会学)
长按控件后,会改变显⽰示的内容 不⽤用考虑了,选择UIButton(因为UIButton有highlighted这种状态)
同时显⽰示2张图⽚片:背景图⽚片、内容图⽚片 不⽤用考虑了,选择UIButton
常用的Xcode插件推荐:http://www.cocoachina.com/industry/20130918/7022.html
如何获得APP内部资源
- 安装一个iTools 百度一下就有
- 用USB连接设备 打开iTools
- 然后选择一个应用
补充知识:
## 定时任务 - 方法1:performSelector // 1.5s后自动调用self的hideHUD方法 [self performSelector:@selector(hideHUD) withObject:nil afterDelay:1.5]; - 方法2:GCD dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 1.5s后自动执行这个block里面的代码 self.hud.alpha = 0.0; }); - 方法3:NSTimer // 1.5s后自动调用self的hideHUD方法 [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(hideHUD) userInfo:nil repeats:NO]; // repeats如果为YES,意味着每隔1.5s都会调用一次self的hidHUD方法
HUD
- - 其他说法:指示器、遮盖、蒙板
- - 半透明HUD的做法
- - 背景色设置为半透明颜色
常见问题
- 项目里面的某个.m文件无法使用
- 检查:Build Phases -> Compile Sources
- 项目里面的某个资源文件(比如plist、音频等)无法使用
- 检查:Build Phases -> Copy Bundle Resources
模型
什么是模型?
- - 专门用来存放数据的对象
- - 一般都是一些直接继承自NSObject的纯对象
- - 内部会提供一些属性来存放数据
一个控件看不见有哪些可能?
- - 宽度或者高度其实为0
- - 位置不对(比如是个负数或者超大的数,已经超出屏幕)
- - hidden == YES
- - alpha <= 0.01
- - 没有设置背景色、没有设置内容
- - 可能是文字颜色和背景色一样
九宫格计算思路
- - 利用控件的索引index计算出控件所在的行号和列号
- - 利用列号计算控件的x值
- - 利用行号计算控件的y值
本文就分享到这里了 感谢你的阅读!