0

私は2つのView Controllerを持っています。最初のものには、別のView Controllerへのセグエがあります。後者のView Controllerに必要なのは、テキストフィールドからの項目を追加し、ボタンをクリックして配列に保存することです。次に、この配列は NSUserDefaults を使用して保存されます。

以下のコードでは、配列にアイテムを正常に格納できます。この配列も NSUserDefaults を使用して保存されます。しかし、最初のビュー コントローラーに戻ってから、2 番目のビュー コントローラーに戻ってアレイに新しいアイテムを追加すると、以前に保存したアイテムがなくなっていました。新しく追加されたアイテムだけが保存されました。

アドバイスをください:)

私の.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

代わりに、シングルトンを使用してみてください。ここで私の答えを参照してください: https://stackoverflow.com/a/10093449/542400ただし、辞書ではなく NSArray にします。

于 2012-04-10T18:01:54.327 に答える
0

NSMutableArray の要素を編集、追加、および削除できるため、NSArray よりも NSMutableArray を使用することをお勧めします。お役に立てれば。

于 2013-01-24T07:37:46.243 に答える
0

上記のコードは、新しく作成されたカード名オブジェクトを設定したことを示しているため、最初に 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 に答える