每当调用视图控制器时,NSUserDefaults中保存的NSArray的内容都会被覆盖

时间:2014-03-03 05:08:34

标签: ios objective-c initialization singleton nsuserdefaults

视图控制器包含:

  1. 的UITextField (名称)。

  2. 的UIButton (保存)。

  3. 输入任何名称并点击“保存”后,该名称将添加到使用NSUserDefaults存储的数组中。

    此视图控制器是从另一个视图控制器推送的,所以当我回到此视图控制器时,NSArray的内容会被我可能指定的新名称覆盖。我不确定是什么造成这种情况,但我怀疑它必须对allocationinitialization的{​​{1}}做些什么。

    在我的ViewDidLoad中,我做了NSArray

    在我的NSMutableArray *namesList= [[NSMutableArray alloc]init];方法中,

    OnSave

    编辑: 相关视图控制器的屏幕截图:

    enter image description here

    在这里,当我点击[namesList addObject:nameTextField.text]; [[NSUserDefaults standardUserDefaults] setObject:namesList forKey:@"namesListArray"]; NSLog(@"items in array: %@",namesArray); 按钮时,会推送第二个视图控制器。 当我输入“kenneth”并点击“保存”时,控制台会说:

    ADD

    现在,在没有回到上一个View Controller的情况下,当我输入另一个名字时,说“john”并点击“保存”,控制台会说:

    2014-03-03 11:03:46.219 SmartWatch[664:a0b] items in array: (
    kenneth)
    

    直到现在一切都很好。 当我回到上一个控制器并返回到第二个View Controller时,会出现问题。现在,当我键入另一个名称时,说“scott”,控制台说:

    2014-03-03 11:15:43.646 SmartWatch[664:a0b] items in array: (
    kenneth,
    john)
    

    这意味着前两个名称被覆盖。我希望数组也保留“kenneth”和“john”,并且“scott”实际上应该附加到数组中。

    我认为这是因为当第二个View Controller再次出现在前台时,数组会被初始化,但我不确定它,我不知道如何纠正这个问题。

    希望现在问题很明确。谢谢!

4 个答案:

答案 0 :(得分:2)

试试这个,

NSArray *nameArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"namesListArray"];
NSMutableArray * namesList;
if (!nameArray) {
    namesList = [[NSMutableArray alloc] init];
} else {
    namesList = [NSMutableArray arrayWithArray:nameArray];

}

保存

[namesList addObject:nameTextField.text];
[[NSUserDefaults standardUserDefaults] setObject: namesList forKey:@"namesListArray"];
[[NSUserDefaults standardUserDefaults] synchronize];

答案 1 :(得分:1)

nameList数组作为属性并放在viewDidLoad

self.namesList = [[[NSUserDefaults standardUserDefaults] objectForKey:@"namesListArray"] mutableCopy];


 if (nil == namesList) 
    {
        self.namesList = [[NSMutableArray alloc]init];
    }

onSave方法

[self.namesList addObject:nameTextField.text];
[[NSUserDefaults standardUserDefaults] setObject:self.namesList forKey:@"namesListArray"];

答案 2 :(得分:0)

您是否在 ViewWillAppear 方法中执行将元素存储到nsarray的任何功能。
如果没有,请正确指定您的代码以提供帮助!

答案 3 :(得分:0)

NSUserDefaults.结尾处添加[[NSUserDefaults standardUserDefaults] synchronize];其他明智的问题是,在哪里,您需要将相关代码放在NSUserDefaults的输出中。