2013-04-06 118 views
0

我有一個自定義類「Bookmark」,其中包含NSString。我使用NSMutableArray來存儲此類的實例,從而製作一個書籤列表,我使用UITableViewCell原型在UITableView中顯示。保存包含自定義類對象的NSMutableArray的內容

有人請給出一些關於如何將NSMutableArray中的實例保存到文件(也可能是如何加載它們的示例)的建議/示例。我找不到任何我搜索過的例子。我試過將數組轉換爲NSData,並使用NSKeyedArchiver沒有成功。我也嘗試轉換爲NSArray,但無法使其正常工作。

在自定義類中,我實現了encodeWithCodeinitWithCoder

我需要在應用程序關閉前保存並且我想在應用程序啓動時加載列表。

我卡住了... :(

編輯:在Ageektrapped的要求,這裏的代碼片段:

我的書籤類的實現內部:

- (void) encodeWithCoder: (NSCoder *) encoder 
{ 
    [encoder encodeObject:self.address forKey:@"Address"]; 
} 

- (id) initWithCoder: (NSCoder *) decoder 
{ 
    self = [super init]; 
    if (self != nil) 
    { 
    self.address = [decoder decodeObjectForKey: @"Address"]; 
    } 
    return self; 
} 

在我的MasterViewController中

self.bookmarks是一個包含書籤對象的NSMutableArray(當下面的代碼被調用時,存在l東一個書籤陣列中的一個條目)。

NSString *docFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory,NSUserDomainMask,YES) lastObject]; 
NSString *filename = [docFolder stringByAppendingPathComponent:@"data.plist"]; 
NSLog(@"File : %@", filename); 
NSLog(@"Bookmarks : %d", self.bookmarks.count); 

NSData *data = [NSKeyedArchiver archivedDataWithRootObject: self.bookmarks ]; 
if ([data writeToFile: filename atomically: YES]) 
{ 
    NSLog(@"Successful write"); 
} else { 
    NSLog(@"Failed write"); 
} 
+0

,你能否告訴我們encodeWithCoder:和的initWithCoder:方法實現?並將該數組保存到文件的代碼? – ageektrapped 2013-04-06 11:25:56

回答

1

我終於弄清楚我的問題是什麼。 由於我在iPhone設備上進行調試,某些文件夾不可寫。我使用的代碼是要求一個位置在這樣的區域(NSDocumentationDirectory):

終於找到=> How can I get a writable path on the iPhone?我明白我的問題,並得到了它的工作之後。

我需要什麼做的是取代:

NSString *docFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory,NSUserDomainMask,YES) lastObject]; 
NSString *filename = [docFolder stringByAppendingPathComponent:@"data.plist"]; 

有:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES); 
NSString *libFolder = [paths objectAtIndex: 0]; 
NSString *filename = [libFolder stringByAppendingPathComponent: @"data.archive"]; 

我也改變了這些行(必須與一致。例如)來自:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject: self.bookmarks ]; 
if ([data writeToFile: filename atomically: YES]) 
{ 
    NSLog(@"Successful write"); 
} else { 
    NSLog(@"Failed write"); 
} 

到:

BOOL success = [NSKeyedArchiver archiveRootObject: self.bookmarks toFile: filename]; 
if (success) 
{ 
    NSLog(@"Successful write"); 
} else { 
    NSLog(@"Failed write"); 
} 

的代碼讀取該文件到NSMutableArray在應用程序啓動是:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES); 
NSString *libFolder = [paths objectAtIndex: 0]; 
NSString *filename = [libFolder stringByAppendingPathComponent: @"data.archive"]; 
self.bookmarks = [NSKeyedUnarchiver unarchiveObjectWithFile: filename]; 
相關問題