2011-11-06 52 views
0

我有一个对象具有自定义UIViews,UIImage,和一些字符串的NSMutableArray。iOS的文件编码/解码视图和图像文件目录

我把那个对象放到字典里。字典被推入NSData然后我这样做:

NSString *path; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
path = [paths objectAtIndex:0]; 

NSString *fileName = DATA; 
path = [path stringByAppendingPathComponent:fileName]; 

NSMutableData *data = [[NSMutableData alloc]init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; 
[archiver encodeObject:dict forKey: DATA]; 
[archiver finishEncoding]; 

[[NSFileManager defaultManager] createFileAtPath:path 
             contents:data 
             attributes:nil]; 

它保存成功。当我尝试加载数据时,文件系统显示我的对象已保存,但是当我尝试解码时,它说我的数据为空。

这里是我的解码码:

-(NSDictionary*)loadData 
{ 
NSString *path; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
path = [paths objectAtIndex:0]; 
NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL]; 

if (directoryContent != nil && [directoryContent count] > 0) 
{ 
    NSLog(@"CONTENT COUNT: %d",[directoryContent count]); 
    NSString *fileName = DATA; 
    path = [path stringByAppendingPathComponent:fileName]; 
    NSData *data = [[NSMutableData alloc]initWithContentsOfFile:[directoryContent objectAtIndex:0]]; 
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
    NSDictionary *dict = [unarchiver decodeObjectForKey: DATA]; 
    [unarchiver finishDecoding]; 

    return dict; 
} 
else 
    return nil; 
} 

我的应用程序,用户可以四处移动一堆意见,我只是试图找到一个简单的方法来存储视图帧,而无需提取转换每个int /字符串值。我也希望不必将我的UIImage分解成一个字节数组,然后将其重新加载回UIImage。

我在这里做疯狂的东西,希望功能是不可能的?

我唯一的选择是将数组中的每个UIView细分为转换,帧等单独的值吗?

想法?

+1

你真的想存档视图并写出UIImages吗?关于你要完成的任务,你不会详细讨论,但如果你只是允许用户移动视图并且想保留这些视图的位置,那么更好的方法是归档这些视图的位置,然后用这个位置信息重新创建视图? – mattyohe

+0

我可以做到这一点。那么UIImage呢?我确实需要存储此图像并重新加载它。我怎么做? – spentak

回答

2

文档目录是否包含您的数据文件以外的任何内容? (我认为它总是至少包含一个名为“收件箱”的子目录)。我注意到在您的loadData方法,这些行:

path = [path stringByAppendingPathComponent:fileName]; 
    NSData *data = [[NSMutableData alloc]initWithContentsOfFile:[directoryContent objectAtIndex:0]]; 

您可以附加fileNamepath,但你不使用它。您只需从directoryContent中提到的第一个文件中读取。