保留使用NSUserDefaults保存的数组的值

时间:2012-04-09 10:04:27

标签: 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

2 个答案:

答案 0 :(得分:0)

所以在 appdelegate 中使用 mutablearray ,在 appdidfinishlaunching 中使用 alloc init 。因此,如果您从其他视图添加内容,它将不会替换您的数据。

也许它会帮助你。

答案 1 :(得分:0)

在我看来,假设错误如下:

NSMutableArray * = cardName _nameOfCards;

这里_nameOfCards被初始化然后设置为0个元素,然后你用cardName创建一个最初具有storato磁盘值的引用,所以现在cardName不再有旧内容,而只有新内容。从这里你错了。

你应该创建一个cardName为_nameOfCards的addObject。

希望有帮助