2013-03-20 85 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中获取活动对象,然后重新运行应用程序,因为引用将被杀死,所以相反,保存数据放在你的类对象通知,字符串或,字典..