2012-04-09 70 views
0

我有两个视图控制器。第一个有一个segue到另一个视图控制器。我希望为后者的视图控制器添加来自文本字段的项目,然后通过点击按钮将其保存在数组中。然后这个数组将被保存使用NSUserDefaults。如何保留一个数组的值

关于下面的代码,我可以成功地将项目存储在我的数组中。这个数组也使用NSUserDefaults保存。然而,当我回到我的第一个视图控制器,然后再次继续到我的第二个视图控制器添加新的项目在我的数组,我以前存储的项目已经消失。新增项目是唯一保存的项目。

建议,请在我的.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 
+0

无法直接“保存”对象数组。该数组只包含指针(地址)。如果你保存并重新加载它们,它们会有含糊不清的含义。你需要序列化它。根据数组或其他东西重建字符串。 – 2012-04-09 06:15:30

+0

为保存数组值,最好使用plist而不是NSUserDefaults。 – vishy 2012-04-09 06:24:01

+0

@HeShiming感谢您的建议。我如何序列化数组?我对这种编程语言很陌生,所以我不太明白。 – Hans 2012-04-09 06:25:11

回答

0

如上面给出的代码:)

在我.h文件中

@interface AddCardViewController : UIViewController <UITextFieldDelegate> 

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

@end 

显示你刚才设置的新创建cardname对象我认为你必须首先从nsuserdefaluts中获取所有数据并将它们添加到_nameOfCards数组中,然后在addNewCard中添加新对象:(id)发件人方法 像

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]; 

我认为这将解决您的问题 尝试 有美好的一天从NSUserDefaults检索

+0

我试过这段代码,但编译器给我一个错误:( – Hans 2012-04-09 09:40:18

+0

哪种类型的错误? – 2012-04-09 09:42:00

+0

你建议的代码在保存的数组中添加了一个新项目,但是下一次我再次添加一个新项目时,应用程序崩溃, ***由于未捕获异常'NSInternalInconsistencyException',原因:' - [__ NSCFArray insertObject:atIndex:]:发送到不可变对象的变异方法' – Hans 2012-04-10 01:45:11

2

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

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

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

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