IOS之plist 沙箱 归档 配置
Day04
1.Plist文件
文件和数组 或者字典之间的转换
数组转换为plist:
step1:创建数组
NSArray *array=@[@"老杨",@"老郭",@"小泽"];
step2:调用数组的writeToFile方法把数组转换为.plist存到指定的位置
[arraywriteToFile:@"/User/tarena6/a.plist" atomically:YES];
atomically:这个参数意思是如果为YES则保证文件的写入原子性,就是说会先创建一个临时文件,直到文件内容写入成功再导入到目标文件里.
如果为NO,则直接写入目标文件里.
plist转换为数组:
NSArray*array=[NSArray arrayWithContentsOfFile:@"/User/gjh/a.plist "];
2.沙箱
工程名称:.app保存着工程中用到的所有素材,此包是只读的;
Document(文件,文档):使用最多,用来保存所有的数据iTunes会自动备份和恢复;
Library/Caches:缓存文件夹 缓存数据
Library/Prefernces:偏好设置用于保存有用的少量数据 iTunes会自动备份和恢复
tmp:临时文件夹,此文件夹下的数据 不定时的可以被销毁
//得到工程中的完整路径:
NSString *path=[[NSBundlemainBundle]pathForResource:@"face/001" ofType:@"gif"];
NSLog(@"path:%@",path);
a.得到app的路径
NSString*appPath=[[NSBundle mainBundle]resourcePath]//resource 资源
b.得到Document文档的路径
方法一:
NSString*home=NSHomeDirectory();
NSString*doicumentPath=[home stringByAppendingComponent:@"Dovument"]
方法二:
documentsPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)[0];
C.获取临时文件夹的路径:
NSString*tempPath=NSTemporaryDirctory();
d. 获取caches的路径
NSStringcachesPath= NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)[0];
3 配置文件
step1:创建用户配置文件 会自动创建一个plist文件在library里的prefernces里面
NSUserDefaults*user=[NSUserDefaults StandardUserDefaults];
step2:先取 如果不存在的时候默认是0
intCount=[user integerForKey:@“Count”];
step3:把取出来的Count加一后存放到user中
[user setImteger:++CountforKey:@"runCount"];
step4:设置同步
[usersynchronize];
[DemoPlistChat编写一个聊天是的表情按钮 实现点击什么按钮显示按钮的相对应的信息]
分析:设置plist文件 是一个数组 数字中的每一项都是一个dictionary dictionary中包含表情的编号表情对象的文字描述 和表情图片
实现步骤:
step1:得到plist文件的路径 并把plist转换为数组
step2:遍历数字 得到的每一项都用字典接受
创建UIButton根据规律创建button的位置 并给button的tag赋值
得到字典中某个键所对应的名称NSString*faceName=[dic objectForKey:@"png"];
为button设置图片
把所有的button放入scrollview中
设置scrollview的contentsize 行数等于 CGFloat line=self.array.count%8==0?self.array.count/8*40:self.array.count/8+1;
为button添加方法
step3:在方法中 实现得到数组中的所点击的button对应的dictionary
根据字典的某个标志得到所需要的信息
已追加的方式写入倒文本框中
//获得plist的路径 并转换为数组
self.array=[NSArrayarrayWithContentsOfFile:@"/Users/tarena6/Desktop/test/第三个月/Day04/DemoPlistChat/DemoPlistChat/face/emoticons.plist"];
//遍历数组 得到的每个都是dictionary类型
for (int i=0; i<self.array.count; i++) {
NSDictionary *dic=self.array[i];
UIButton *btn=[[UIButtonalloc]initWithFrame:CGRectMake(i%8*40, i/8*40, 40, 40)];
btn.tag=i;
//得到字典中的某个键所对应的名称
NSString *faceName=[dicobjectForKey:@"png"];
[btn setImage:[UIImageimageNamed:faceName] forState:UIControlStateNormal];
[self.MySV addSubview:btn];
CGFloat line=self.array.count%8==0?self.array.count/8*40:self.array.count/8+1;
[self.MySV setContentSize:CGSizeMake(0,line)];
[btn addTarget:selfaction:@selector(clock:) forControlEvents:UIControlEventTouchUpInside];
}
-(void)clock:(UIButton*)btn{
NSDictionary *dict=self.array[btn.tag];
NSString *name=[dictobjectForKey:@"chs"];
//以追加的方式向textfile里面添加内容
self.showTF.text=[self.showTF.textstringByAppendingString:name];
}
4 归档
把对象和data之间相互转换,只有实现了NSCoding的协议对象才能进行归档
归档的方式一:
NSArray *name=@[@"张三",@"李四",@"王五",@"赵六"];
step1:准备一个可变的Data
NSMuatableData*data=[NSMutableData data];
step2:创建归档对象
NSKeyedArchiver*arch=[[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
step3:编码
[archencodeObject:names forKey:@“names ”];
//可以向一个data数据中添加多个对象
step4:完成编码
[archfinishEncoding]
[datawriteToFile:@"User/tarena/Desktop/name.arch atomically:YES"];
归档生成的文件不能直接使用系统提供的或者其他应用程序打开
************反归档
step1:拿到归档的文件 可以是网上的数据 也可以是本地保存的数据
NSData*data=[NSData dataWithContentsOfFile:@"/Users/Gjh/name.arch"];
step2:创建反归档对象
NSKeyedUnarchiver*unArch = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
step3:解码
NSArray *names= [unArch decodeObjectForKey:@"names"];
归档方式二:
//直接拿到数据进行归档
NSData*data=[NSKeyedArchiver archivedDataWithRootObject:self.view.subviews];
//设置归档保存的位置
[datawriteToFile:@"/Users/tarena6/Desktop/Views/subView_4"atomically:YES];
********反归档
//拿到归档的文件
NSString*path=@"/Users/tarena6/Desktop/Views/subView_0";
//将归档的文件转换为NSData
NSData*data=[NSData dataWithContentsOfFile:path];
//将创建的data对象解码为NSArray
NSArray*subViews=[NSKeyedUnarchiver unarchiveObjectWithData:data];