1

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

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

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

  • 当前的婴儿名字显示在UILabel.
  • 用户按下“保存”,然后将 label.text 值附加到 a 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

4

2 回答 2

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];
于 2012-05-21T21:06:14.597 回答
2

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

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

最后,您永远不会真正将更改保存到NSUserDefaults. 如果我没记错的话,在您完成更改后,您需要致电synchronize- 否则您的更改将在应用程序关闭后立即丢失。哪种方式扼杀了使用数据持久性的全部目的。:)

于 2012-05-21T21:06:39.407 回答