我将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.
}
希望你帮助我!谢谢!
答案 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);
}