使用 NSMutableDictionary 将对象保存到数组

Posted

技术标签:

【中文标题】使用 NSMutableDictionary 将对象保存到数组【英文标题】:Saving an object to array using NSMutableDictionary 【发布时间】:2011-10-06 20:37:03 【问题描述】:

我一直在尝试将一个对象作为 NSMutableDictionary 添加到我从另一个视图访问的数组中,但它似乎不起作用。我希望能够将数据存储在我从 NSDictionary 访问的 plist 中。

-(void)saveAlarm:(id)sender 

    // Adding object for alarm to AlarmViewController

    alarmArrayCopy = alarmViewController.alarmsTime;

    NSMutableDictionary *newAlarm =  [[NSMutableDictionary alloc] init];
    [newAlarm setValue:labelTextField.text forKey:LABEL_KEY];
    [newAlarm setValue:alarmPicker.date forKey:TIME_KEY];
    [alarmArrayCopy addObject:(newAlarm)];

    // Dismissing and tiding up.

    [self.navigationController dismissModalViewControllerAnimated:YES];
    [newAlarm release];

更新:如何将 NSDictionary 添加到我的 plist 数据库(我的 db 是一个数组)?

这是一些新代码,我将 NSMutableDictionary 更新为 NSDictionary,因为在我的 plist 中您只能拥有普通字典而不是可变字典。但现在它崩溃了,给了我一个Thread 1:Program received signal: "SIGABRT".

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"data.plist"];

// Adding object for alarm to AlarmViewController

NSDictionary *newAlarm =  [[NSDictionary alloc] init];
[newAlarm setValue:labelTextField.text forKey:LABEL_KEY];
[newAlarm setValue:[NSString stringWithFormat:@"%@", alarmPicker.date] forKey:TIME_KEY];
[newAlarm writeToFile:finalPath atomically:NO];

-(IBAction)saveAlarm:(id)sender

// Adding object for alarm to AlarmViewController

NSString *time = [NSString stringWithFormat:@"%@", alarmPicker.date];
NSString *label = [NSString stringWithFormat:@"%@",labelTextField.text];

NSDictionary *newAlarm = [[NSDictionary alloc] initWithObjectsAndKeys:label, LABEL_KEY,time, TIME_KEY, nil];
self.alarmArrayCopy = alarmViewController.alarmsTime;
[alarmArrayCopy addObject:(newAlarm)];

// Dismissing and tiding up.
[newAlarm release];
[self.navigationController dismissModalViewControllerAnimated:YES];

【问题讨论】:

我没有收到任何错误,它只是不起作用。 【参考方案1】:

首先,您应该使用setObject:forKey: 方法将对象添加到NSMutableDictionary。其次,如果你使用NSDictionary,你应该使用initWithObjectsAndKeys:方法。

setValue:forKey键值编码 协议的一种方法。这是在这里描述的“ Where's the difference between setObject:forKey: and setValue:forKey: in NSMutableDictionary? ”

所以,你应该这样做,

NSDictionary *newAlarm = [[NSDictionary alloc] initWithObjectsAndKeys:
                                               labelTextField.text, LABEL_KEY,
                                               alarmPicker.date, TIME_KEY, nil];

【讨论】:

谢谢,这解决了我的问题,但我遇到了一个新问题。存储在字典中的数据,如何将其添加到我的 plist 中?我的意思是我已经尝试 writeToFile 并尝试将其添加到数组中,但我不能。我会放一些新代码。【参考方案2】:
[newAlarm setValue:alarmPicker.date forKey:TIME_KEY];

我不太确定,但我猜您的错误是因为您无法将 NSDate 对象的实例发送到 setValue:forKey 方法。您可以使用 setObject:forKey 或通过 [NSString stringWithFormat:"%@", alarmPicker.date] 将 NSDate 更改为 NSString。

希望对您有所帮助。

【讨论】:

setObject:forKey,不是setValue:forKey

以上是关于使用 NSMutableDictionary 将对象保存到数组的主要内容,如果未能解决你的问题,请参考以下文章

如何获得 NSDictionary/NSMutableDictionary 的原始顺序?

使用 NSMutableDictionary 将对象保存到数组

NSMutableDictionary 没有得到预期的输出。

使用 UIImageView 作为 NSMutableDictionary 中的键来查找布尔值

释放数组时 NSMutableDictionary 中使用的对象的内存会发生啥?

使用 NSJSONSerialization 将 NSMutableDictionary 转换为 JSON 会返回不同的结果