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值

本文就分享到这里了  感谢你的阅读!

posted @ 2015-07-11 01:17  勇敢的少年  阅读(168)  评论(0编辑  收藏  举报