1

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

存储NSObjects到 aNSMutableArray中,将数据显示到 aUITableView并将数据保存到NSUserDefaults. 我能够将 a 存储NSObject到 aNSMutableArray中并将其显示在 中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,并在我的第三个 UIViewController 中显示数据,而我的第一个是存储数据的基本操作屏幕。

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

4

3 回答 3

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;
}
于 2013-03-20T05:15:30.147 回答
2

当应用程序终止时,您需要使用applicationDidEnterBackgroundApp Delegate 的事件来存储数组。

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

当您的 App 再次加载时,您需要使用didFinishLaunchingWithOptionsApp 委托的委托加载数据。

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   nameList = (NSMutableArray *)[[NSUserDefaults standardUserDefaults] objectForKey:@"dataArray"];
   if(!nameList)
   {
       //First time load or data is not saved yet
   }
}
于 2013-03-20T05:17:34.837 回答
0

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

于 2013-03-20T05:17:55.057 回答