将值附加到NSMutableArray并保存到NSUserDefaults

时间:2012-05-21 20:56:03

标签: iphone objective-c ios xcode cocoa-touch

我正在为iPhone创建一个名称生成器应用程序,这正是我想要做的。

  • 允许用户通过单击保存按钮来保存当前生成的名称。

为了做到这一点,以下是正在发生的事情:

  • 当前的babyname显示在UILabel
  • 用户按“保存”,然后将label.text值附加到NSMutableArray(我认为这在我的代码中无法正常工作)。
  • NSMutableArray随后会保存在NSUserDefaults
  • 然后将内容加载到另一个视图中以填充UITableView个单元格。

我的具体问题是,我是否正确处理了此保存/持久存储过程?以下是相关代码段:

- (IBAction)saveName:(id)sender {
// save current baby name to array
NSMutableArray *babyNameArray = [[NSMutableArray alloc] init];

[babyNameArray addObject:babyname.text];

// save list of babynames to nsuserdefaults

[[NSUserDefaults standardUserDefaults] setObject:babyNameArray forKey:@"My Key"];


// for testing log names listed in nsuserdefaults
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

}

以下是整个文件内容的pastebin链接(带注释):http://pastebin.com/hQRM9Azh

2 个答案:

答案 0 :(得分:7)

每次添加时,您都会重新开始使用空数组([[NSMutableArray alloc] init]) - 而不是从现有项目开始。

以下是一些代码,它们会添加到现有条目中:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *babyNameArray = [[defaults stringArrayForKey:@"My Key"] mutableCopy];
if (!babyNameArray) babyNameArray = [[NSMutableArray alloc] init];
[babyNameArray addObject:babyname.text];
[defaults setObject:babyNameArray forKey:@"My Key"];
[defaults synchronize];

答案 1 :(得分:2)

在我们开始解决这个大问题之前的一些事情。首先,您需要将这些名称数组存储在文件中的某个位置,您可以在应用程序启动时或在ViewWillAppear / ViewWillLoad中读取这些数据。

其次,你现在的工作方式,你一次只能保存一个名字。你分配&每次用户单击“保存名称”按钮时,都会初始化一个新的(空)数组。然后,将当前名称添加到此(空)数组,并将其设置为键“My Key”的对象。请注意,“我的密钥”对象将始终只有一个元素 - 最近保存的名称。

最后,您实际上从未将更改保存到NSUserDefaults。如果我没记错,在您完成更改后,您需要致电synchronize - 否则您的更改将在应用程序关闭后立即丢失。哪种杀死使用数据持久性的整个目的。 :)