0

我有两个视图控制器。第一个与另一个视图控制器有一个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

4 回答 4

2

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

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

NSMutableArray *cardName = [[[defaults objectForKey:@"cardName"] mutableCopy] autorelease];
于 2012-04-10T04:11:03.660 回答
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];

我想这会解决你的问题试试它有美好的一天

于 2012-04-09T06:29:49.160 回答
0

尝试使用单例,而不是。在这里查看我的答案:https ://stackoverflow.com/a/10093449/542400但将其设为 NSArray 而不是字典。

于 2012-04-10T18:01:54.327 回答
0

使用 NSMutableArray 比使用 NSArray 更好,因为你可以在 NSMutableArray 中编辑、添加和删除元素。希望这可以帮助。

于 2013-01-24T07:37:46.243 回答