2017-08-02 85 views
0

我见过几篇关于如何不能在NSUserDefaults中保存基于NSMutableArray的对象的文章,但有一种方法可以使用[NSKeyedArchiver]并使用NSCoder对其进行编码,尽管我正在努力去理解如何去做并希望有人能够帮助。如何在NSUserDefaults中保存“自定义类对象”的NSMutableArray?

Student *student1 = [Student studentWithImage:[UIImage imageNamed:@"default"] withForename:@"John" withSurname:@"Smith" withAddress:@"3 Fake Road, Faketown, FA31 KEE" withDateOfBirth:[dateFormatter dateFromString:@"17-Jul-93"] withAge:24]; 
[studentArray addObject:student1]; 

我想这和其他一些类似Students保存到我的NSMutableArraystudentArray。然后我想将这个数组保存到NSUserDefaults并重新加载它。

I have seen this post here看起来像是我的问题的正确答案,但我需要帮助实现它到我的代码,因为我很难理解它! 感谢

+0

你想保存studentArr唉在userdafaults? – KKRocks

+0

@KKRocks多数民众赞成在正确的,我需要保存的数组包含它的属性,如学生图像,名称,出生日期等。 – Manesh

+0

@Mahesh检查我的答案,并添加你的财产,因为我提到。 – KKRocks

回答

3

首先在Student类中添加这

- (void)encodeWithCoder:(NSCoder *)coder; 
{ 
    [coder encodeObject:self.Forename forKey:@"keyForename"]; 
    // do same for all property 
} 

- (id)initWithCoder:(NSCoder *)coder; 
{ 
    self = [[Student alloc] init]; 
    if (self != nil) 
    { 
     self.Forename = [coder decodeObjectForKey:@"keyForename"]; 
     // do same other property here 
    } 
    return self; 
} 

存储阵列

[studentArray addObject:student1]; 
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:studentArray] forKey:@"mySavedArray"]; 

检索阵列

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *savedArray = [currentDefaults objectForKey:@"mySavedArray"]; 
if (savedArray != nil) 
{ 
     NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:savedArray]; 
     if (oldArray != nil) { 
       customObjectArray = [[NSMutableArray alloc] initWithArray:oldArray]; 
     } else { 
       customObjectArray = [[NSMutableArray alloc] init]; 
     } 
} 
+0

这工作出色,虽然我现在唯一的问题是,studentImage没有保存。我用'[coder encodeObject:self.studentImage forKey:@“keyStudentImage”];'但是当加载数组时,图像不加载? – Manesh

+1

我已经完成了,不用担心:'[coder encodeObject:UIImagePNGRepresentation(self.studentImage)forKey:@“keyStudentImage”];'在encodeWithCoder'和'self.studentImage = [UIImage imageWithData:[coder decodeObjectForKey:@“keyStudentImage”]];'在'initWithCoder'中。再次感谢KKRocks – Manesh

相关问题