通过plist保存数据
- 直接将数据写在代码里,不是一种合理的做法。如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低
- 因此可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据。如果要变动数据,直接修改数据文件即可,不用修改代码
- 一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种"属性列表文件"的扩展名是plist,因此也称为"plist文件"
- 文件名不能叫"Info"
// 1. 将数据写入到plist文件中
NSArray *names = @[@"1", @"2", @"3"];
NSString *path = [[NSBundle mainBundle] pathForResource:@"names" ofType:@"plist"];
BOOL flag = [names writeToFile:path atomically:YES];
if (flag) {
NSLog(@"写入成功")
}
// 2. 从plist文件中读取数据
[NSArray arrayWithContentsOfFile:path];
模型
1. 字典转模型
- 模型
专门用来存放数据的对象
一般继承NSObject,在.h文件中声明一些用来存放数据的属性
注意添加类前缀 - 用模型取代字典的好处
使用字典时,一般情况下,设置数据和取出数据都使用"字符串类型的key"
编写这些key时,编译器没有智能提示
key容易写错,且编译器不会有任何警告和报错
数据模型,是专门用来存放数据的对象,用它来表示数据会更加专业
使用模型访问属性时,编译器会提供一系列的提示,提高编码效率
2. instancetype
// 提供类方法方便调用
+ (instancetype)personWithDict:(NSDictionary *)dict;
// 返回值类型检测,用instancetype作为返回值,类型不匹配会有警告
NSString *str = [DGPerson personWithDict:dict];
自定义控件
自定义控件:继承自系统的控件写一个自己的控件
目的:封装控件内部的一些细节
1. initWithFrame:
/**
子控件最好重写initWithFrame:方法,不要重写init方法
外部如果用init方法初始化,系统会自动调用initWithFrame:方法
*/
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
}
return self;
}
2. layoutSubviews
/**
布局子控件,设置子控件的位置和尺寸
方法调用时机:
当前控件第一次显示的时候
当前控件尺寸(宽度/高度)发生改变的时候
*/
- (void)layoutSubviews {
[super layoutSubviews];
NSLog(@"%@", NSStringFromCGRect(self.frame));
}
xib
1. xib与storyboard对比
- 共同点
都用来描述软件界面
都用Interface Builder工具类编辑
本质都是转换成代码去创建控件 - 不同点
xib是轻量级的,用来描述局部的UI界面
storyboard是重量级的,用来描述整个软件的多个界面,并且能展示多个界面之间的跳转关系
2. 基本使用
- 加载xib文件
/**
.c -> 编译成功 -> .o
xib -> nib
*/
// 第一种方式
NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"test" owner:nil options:nil];
// 第二种方式
UINib *nib = [UINib nibWithNibName:@"test" bundle:nil]; //参数传nil,默认是mainBundle
NSArray *array = [nib instantiateWithOwner:nil options:nil];
// xib加载的控件,不设置尺寸会有默认尺寸(在xib文件中自己设置的尺寸)
UIView *view = array.firstObject;
[self.view addSubview:view];
- 自定义view封装xib设置数据
如何打开双界面?
打开xib文件,点击option键的同时打开.m文件 - 如果一个控件是通过xib创建的,初始化时不会调用initWithFrame:方法
- 如果一个控件是从xib创建出来的,初始化时会调用initWithCoder:方法
- (instancetype)initWithCoder:(NSCoder *)coder;
/// 如果一个控件是从xib创建出来的,加载完毕的时候调用
- (void)awakeFromNib;
2. 加载原理
DGPersonView *personView = [[DGPersonView alloc] initWithCoder:nil];
personView.frame = CGRectMake(0, 0, 70, 90);
personView.backgroundColor = [UIColor orangeColor];
UIImageView *iconImageView = [[UIImageView alloc] initWithCoder:nil];
iconImageView.frame = CGRectMake(0, 0, 70, 70);
iconImageView.image = [UIImage imageNamed:@"icon"];
[personView addSubview:iconImageView];
personView.iconImageView = iconImageView;