什么是Plist文件
- 直接将数据直接写在代码里面,不是一种合理的做法。如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低
- 因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据。如果要变动数据,直接修改数据文件即可,不用修改代码
- 一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种“属性列表文件”的扩展名是plist,因此也称为“plist文件”
plist文件创建
- 如图创建文件:
- key的root箭头向下的时候才能添加【注意】,可以添加到字典或者数组中,如果不是向下,添加的是平级的关系的。
- 可以复制进行快速的添加
- 加载plist文件的时候,返回值什么时候用NSArray,什么时候使用NSMutableArray?
- 只要是添加到项目中的plist文件,加载plist文件的时候用的是全路径
注意事项
- 项目中黄颜色的文件夹有的是虚拟的文件的【右击 show in finder 是找不到的】,装到手机上这个文件夹也是不存在的。【所以在写路径的时候是没有这一层路径的】
- 项目中有的黄色的文件夹不是虚拟的,是存在的,那么在获取路径的时候是需要也是不需要写这层的。装到手机上也是不存在的。
- 如 :NSString *file = [bundle pathForResource:@"shops" ofType:@"plist"],不需要写@“data/shops” 如图:
- 在添加文件的时候,弹出的选项如图:
- 第一个是复制,如果不复制的话,删除的时候也会把引用的给删除了。
- 第三个:是否添加到主资源包里面,如果没有选中添加,那么项目中是可以看到的, 但是装到手机里面是没有的。
【解决方法: 如果是资源文件:删除引用重写添加;或者选中项目--Build Phases - copy Bundle Resources 在里面添加】
如果是类相关的文件,这一项没有勾选,项目中是有的,但是加载的时候会报错的
如图类没有定义 - 这个时候先去这里查看这个类是否参与编译:或者选中项目--Build Phases -compile Sources是否有这个类的.m文件,如果没有就去添加
- 第二个:
注意:自己创建的plist文件名不能叫Info.plist,无论是否在同一个文件夹中:plist的文件名不能叫做“info”、“Info”之类的
- 注意:自己创建的plist文件名不能叫Info.plist,无论是否在同一个文件夹中
plist的文件名不能叫做“info”、“Info”之类的
解析Plist文件
1. 通过代码来解析Plist文件中的数据
获得Plist文件的全路径
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"shops" ofType:@"plist"];
加载plist文件
// 加载plist数据
// 一个NSBundle对象对应一个资源包(图片、音频、视频、plis等文件)
// NSBundle的作用:用来访问与之对应的资源包内部的文件,可以用来获得文件的全路径
// 项目中添加的资源都会被添加到主资源包中
// [NSBundle mainBundle]关联的就是项目的主资源包
//NSbundle也是一个类,也有init方法
NSBundle *bundle = [NSBundle mainBundle];
// 利用mainBundle获得plist文件在主资源包中的全路径
NSString *file = [bundle pathForResource:@"shops" ofType:@"plist"];
// NSString *file = [bundle pathForResource:@"shops.plist" ofType:nil];
// 凡是参数名为File,传递的都是文件的全路径
self.shops = [NSArray arrayWithContentsOfFile:file];