将NSObject的NSMutableArray存储到NSUserDefaults中

时间:2013-03-20 05:10:01

标签: ios objective-c xcode nsmutablearray nsuserdefaults

我目前正在为iPhone编写应用程序,我需要遵循的设计要求之一是:

NSObjects存储到NSMutableArray,将数据显示为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.

我在NSObjects中添加secondUIViewController,并在我的thirdUIViewController中显示数据,而我的第一个是存储数据的基本操作屏幕。

所以我的问题是,鉴于我用来定义NSObject的代码以及如何将所述对象存储到NSMutableArray,我如何将NSMutableArray存储到NSUserDefaults关于app关闭。想法是数组需要使用上次运行的数据加载程序数组,因此用户可以跟踪他/她的数据。

3 个答案:

答案 0 :(得分:2)

如果你需要编写包含字符串的数组,那么:

保存:

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

阅读:

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

当您需要编写包含对象的Array时,您需要对它们进行编码并使用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;
}

答案 1 :(得分:2)

您需要在应用程序终止时使用App Delegate的applicationDidEnterBackground事件存储数组。

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

当您的应用再次加载时,您需要使用App代理的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
   }
}

答案 2 :(得分:0)

这个概念非常简单。您正在创建类Name的对象,并在UITableView中显示它。当您创建一个对象并在UiTableView中显示它时,您使用内存地址,您只需从NSMutableArray中获取活动对象,而您尝试在NSUserDefaults中保存该对象,并重新运行该应用程序,您什么也得不到,因为该引用将被杀死,因此保存您的类对象中的数据通知,字符串或,字典..