如何在NSUserDefaults中的NSMutableArray中存储多个对象?

时间:2014-03-09 17:08:59

标签: ios objective-c nsmutablearray nsuserdefaults

我将NSmutableArray存储在NSUSerdefaults和数组中我想从Textfield存储多个字符串,但是当我读取NSlog中的对象数时,它只发送我写的最后一个对象...继承我的代码:

@property(nonatomic, strong)NSMutableArray *tasks;

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    self.tasks = [[NSMutableArray alloc]init];

    [self.tasks addObject:textField.text];
    [userDefaults setObject:self.tasks forKey:@"tasks"];

    NSLog(@"tasks:%@", [[NSUserDefaults standardUserDefaults]objectForKey:@"tasks"]);
    NSLog(@"number of tasks:%d", self.tasks.count); <--- If i write more than 2 strings it sends only the last one and 1 number of task.
}

希望你帮助我!谢谢!

5 个答案:

答案 0 :(得分:1)

您正在编写阵列,但从不回读它。因此,每次更换现有数据而不是附加到现有数据。尝试:

self.tasks = [[NSMutableArray alloc] initWithDictionary:[userDefaults objectForKey:@"tasks"]];

答案 1 :(得分:1)

这正是你所要求的。你想随着时间的推移建立这个字符串数组吗?如果是这样,你需要做这样的事情:

NSMutableArray *tasks = nil;
if([[NSUserDefaults standardUserDefaults] objectForKey:@"tasks"]) {
   tasks = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"tasks"]];
} else {
   tasks = [NSMutableArray array];
}

// Add new task
[tasks addObject: [textField text] ];

[[NSUserDefaults standardUserDefaults] setObject:tasks forKey:@"tasks"];
[[NSUserDefaults standardUserDefaults] synchronize];

注意:我现在不使用Xcode,所以将上面的内容视为伪代码。

答案 2 :(得分:1)

替换:

self.tasks = [[NSMutableArray alloc]init];

使用:

if (!self.tasks) self.tasks = [NSMutableArray new];

您的原始方式是创建一个新数组,这意味着以前存储在self.tasks中的任何内容都会被覆盖并且不存在。然后,当您设置NSUserDefaults&#34;任务&#34;对于这个数组的值,它用这个新分配的数字替换旧数组,它不包含以前存储的项目。

使用if(!self.tasks)self.tasks = [NSMutableArray new];我们只创建一个新数组,如果还没有:

请注意,在最初的未来实例化中,使用新的NSMutableArray可能并不明智,你应该根据Wain的回答做这样的事情:

self.tasks = [[NSMutableArray alloc] initWithDictionary:[userDefaults objectForKey:@"tasks"]];

这种方式首次初始化self.tasks时会与userDefault值同步

答案 3 :(得分:0)

我尝试了以下代码:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSMutableArray *strings = [@[@"One", @"Two", @"Three"] mutableCopy];

[preferences setObject:strings forKey:@"strings"];

NSMutableArray *stringsArray = [preferences objectForKey:@"strings"];

for (NSString *string in stringsArray) {
    NSLog(@"string: %@", string);
}

正如您所料,我收到了3条日志消息,每封NSString一封。

您能否显示NSLog来电的输出?

正如其他答案所提到的,您发布的特定代码每次都会覆盖存储的NSMutableArray,这样您才能获得推送的单个(最后)项目。在创建全新[NSUserDefaults standardUserDefaults]并将其用于分配之前,您应该检查objectForKey已经拥有NSMutableArray

这样的事情应该有效:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSMutableArray *tasks = [preferences objectForKey:@"tasks"];
if (tasks == nil) {
    tasks = [NSMutableArray array];
}

id task = nil; // create the new task somehow

[tasks addObject:task];

[preferences setObject:tasks forKey:@"tasks"];

for (id task in [preferences objectForKey:@"tasks"]) {
    // you should now have an array that is being built incrementally
}

答案 4 :(得分:0)

试试这个:

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    if(!self.tasks)
        self.tasks = [[NSMutableArray alloc]init];

    [self.tasks addObject:textField.text];
    [userDefaults setObject:self.tasks forKey:@"tasks"];

    NSLog(@"tasks:%@", [[NSUserDefaults standardUserDefaults]objectForKey:@"tasks"]);
    NSLog(@"number of tasks:%d", self.tasks.count);
}