2013-03-20 90 views
1

我目前正在寫一個iPhone應用程序,並設計要求我需要的是遵循一個如下:存儲NSObjects的一個NSMutableArray到NSUserDefaults的

商店NSObjectsNSMutableArray,顯示數據爲UITableView並將數據保存到NSUserDefaults。我能夠將NSObject存儲到NSMutableArray中並將其顯示在UITableView中,但我需要幫助瞭解如何將數據存儲在NSObjectNSUserDefaults之間。

我爲NSObject (.h)定義:

#import <Foundation/Foundation.h> 
    @interface Name : NSObject 
    @property (nonatomic)NSString *name; 
    @property (nonatomic)NSInteger score; 
    @end 

我的NSObject (.m)

#import "Name.h" 
    @implementation Name 
    -(id)initWithName:(NSString*)name andScore:(NSInteger)score 
    { 
    _name = name; 
    _score= score; 
    return [super init]; 
    } 
    @end 

實現這是我保存到我的NSObject

NSString *newName = _submitNameTextBox.text; 
    NSInteger score = 0; 
    Name *name = [[Name alloc] init];//Name is the object name 
    name.name = newName; 
    name.score = score; 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    NSMutableArray *listTemp = appDelegate.nameList; //main copy of my list is in app delegate, but i have it accessible by my uiviewcontrollers. 

我在secondUIViewController添加NSObjects,和迪展示我的thirdUIViewController中的數據,而我的第一個數據是存儲數據的基本操作屏幕。

所以我的問題是,給我用來定義我NSObject代碼,以及如何我店家所說的對象到NSMutableArray,如何將NSMutableArray存儲NSUserDefaults上的應用程序停機。想法是數組需要從上次運行的數據加載程序數組,因此用戶可以跟蹤他/她的數據。

+0

[[NSUserDefaults standardUserDefaults] setObject:self.arrayOfPDF forKey:@「」]; [[NSUserDefaults standardUserDefaults] synchronize]; – 2013-03-20 05:12:18

+0

您不能在'NSUserDefaults'中存儲自定義對象。您需要先將它們編碼爲「NSData」。 – rmaddy 2013-03-20 05:13:30

+0

Init方法可能無法做到您認爲的那樣 – 2013-03-20 06:50:33

回答

2

如果你需要編寫數組包含字符串,那麼:

節能:

[[NSUserDefaults standardUserDefaults] setObject:yourArray forKey:@"ArrayKey"]; 

閱讀:

NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"ArrayKey"]]; 

當你需要編寫包含對象數組,你需要對其進行編碼並使用Archiver。

- (void)encodeWithCoder:(NSCoder *)coder { 
    [coder encodeObject:array forKey:@"array"]; 
} 

- (id)initWithCoder:(NSCoder *)coder { 
    array=[coder decodeObjectForKey:@"array"]; 
    return self; 
} 


- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError 
{ 
    return nil; 
} 

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError 
{ 
    yourObject=[NSKeyedUnarchiver unarchiveObjectWithData:data]; 
    NSLog(@"array is ->%@",[yourObject array]); 
    return YES; 
} 
2

您需要存儲陣列,當應用程序被終止,使用applicationDidEnterBackground事件應用程序委託的。

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [[NSUserDefaults standardUserDefaults] setObject:nameList forKey:@"dataArray"]; 
} 

當你的應用程序加載時再次,您需要使用didFinishLaunchingWithOptions委託應用程序委託的加載數據。

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    nameList = (NSMutableArray *)[[NSUserDefaults standardUserDefaults] objectForKey:@"dataArray"]; 
    if(!nameList) 
    { 
     //First time load or data is not saved yet 
    } 
} 
+1

「applicationWillTerminate」不適用於大多數應用程序。進入後臺後節省將是更好的選擇。 – rmaddy 2013-03-20 05:18:57

+0

另外,這對於非屬性列表對象不起作用。 – 2013-03-20 05:19:35

+0

@ H2CO3:我只是回答了OP關於「如何在應用程序關閉時將NSMutableArray存儲爲NSUserDefaults」的問題,想法是數組需要從上次運行的數據加載程序數組,因此用戶可以跟蹤他/她的數據。「 – 2013-03-20 05:22:17

0

這個概念很簡單。您正在創建類名稱的對象,並在UITableView中顯示它。當你創建一個對象並在UiTableView中顯示它時,你可以使用內存地址,當你嘗試將對象保存在NSUserDefaults中時,你只需從NSMutableArray中獲取活動對象,然後重新運行應用程序,因爲引用將被殺死,所以相反,保存數據放在你的類對象通知,字符串或,字典..

相關問題