2017-08-02 100 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

相關問題