如何保留数组的值

时间:2012-04-09 06:10:03

标签: iphone objective-c ios5 xcode4 nsuserdefaults

我有两个视图控制器。第一个具有到另一个视图控制器的segue。我想要的后一个视图控制器是添加来自文本字段的项目,然后通过按钮单击将其保存在数组中。然后使用NSUserDefaults保存此数组。

在下面的代码中,我可以成功地在我的数组中存储项目。此阵列也使用NSUserDefaults保存。然而,当我回到我的第一个视图控制器,然后再次进入我的第二个视图控制器以在我的阵列上添加新项目时,我之前存储的项目已经消失。新添加的项目是唯一保存的项目。

建议请:)

在我的.h文件中

@interface AddCardViewController : UIViewController <UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet UITextField *cardNameTextField;

@end

在我的.m文件中

@interface AddCardViewController ()

@property (nonatomic, strong)NSMutableArray *nameOfCards;

@end


@implementation AddCardViewController 

@synthesize cardNameTextField = _cardNameTextField;

@synthesize nameOfCards = _nameOfCards;


// setting my array
- (NSMutableArray *)nameOfCards 
{
    if (!_nameOfCards) _nameOfCards = [[NSMutableArray alloc] init];

    return _nameOfCards;
}

- (void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    self.cardNameTextField.delegate = self;
}


- (BOOL) textFieldShouldReturn:(UITextField *)textField{

    [self.cardNameTextField resignFirstResponder];

    return YES;
}

- (void)viewDidLoad
{
    //getting the data saved

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSMutableArray *cardName = [defaults objectForKey:@"cardName"];

    NSLog(@"contents of my array %@", cardName);

    [super viewDidLoad];

}

- (IBAction)addNewCard:(id)sender {
    [self.nameOfCards addObject:self.cardNameTextField.text];
    NSLog(@"contents :%@", _nameOfCards);


    // this is how to save the data

    NSMutableArray *cardName = _nameOfCards;

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults setObject:cardName forKey:@"cardName"];

    [defaults synchronize];

    NSLog(@"data saved");

}


@end

4 个答案:

答案 0 :(得分:2)

NSUserDefaults检索的对象总是不可变的,即使您为键设置了一个可变对象。您可以将其视为NSUserDefaults制作副本。

如果您需要基于NSUserDefaults中存储的内容的可变对象,请制作一个可变副本。例如:

NSMutableArray *cardName = [[[defaults objectForKey:@"cardName"] mutableCopy] autorelease];

答案 1 :(得分:0)

因为上面给出的代码显示你刚刚设置了新创建的cardname对象,我认为你必须首先从nsuserdefaluts中获取所有数据并将它们添加到_nameOfCards数组中,然后在addNewCard中添加新对象:(id)sender方法 像

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSMutableArray *cardName = [defaults objectForKey:@"cardName"];
self.nameOfCards = cardName;

[self.nameOfCards addObject:self.cardNameTextField.text];

NSMutableArray *finalCardNames = [[NSMutableArray alloc] initWithArray:self.nameOfCards copyItems:YES];

[defaults setObject:finalCardNames forKey:@"cardName"];

[defaults synchronize];

我认为这可以解决您的问题 试试吧 祝你有美好的一天

答案 2 :(得分:0)

请尝试使用单身人士。请在此处查看我的答案:https://stackoverflow.com/a/10093449/542400但请将其设为NSArray而不是字典。

答案 3 :(得分:0)

使用NSMutableArray比使用NSArray更好,因为您可以编辑,添加和删除NSMutableArray中的元素。希望这会有所帮助。