0

我是 Objective-C 编程的新手,我的 NSMutableArray 有问题...

当我第一次尝试时,我的数据保存得很好,但如果我想再试一次,第一个被新的覆盖,新的也被保存。

一个例子来理解:

第一次尝试:

Tabobjets : (
        {
        Contact = 1;
        DateARendre = 1;
        DateJour = "2013-03-19 19:27:29 +0000";
        Nom = 1;
        Rendu = 0;
        Titre = 1;
    }
)

第二次尝试:

Tabobjets : (
        {
        Contact = 2;
        DateARendre = 2;
        DateJour = "2013-03-19 19:27:40 +0000";
        Nom = 2;
        Rendu = 0;
        Titre = 2;
    },
        {
        Contact = 2;
        DateARendre = 2;
        DateJour = "2013-03-19 19:27:40 +0000";
        Nom = 2;
        Rendu = 0;
        Titre = 2;
    }
)

这是我的代码

@interface SecondViewController () {
    NSMutableDictionary *tabObjet;
    NSMutableArray *tabObjets;
    NSString *appFile;
}

@end

@implementation SecondViewController

- (void)viewWillAppear:(BOOL)animated{
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    // the path to write file
    appFile = [documentsDirectory stringByAppendingPathComponent:@"Bigre.plist"];

    if (tabObjets == nil) {
        tabObjets = [[NSMutableArray alloc] initWithContentsOfFile:appFile];
    }

    if (tabObjet == nil) {
        tabObjet = [[NSMutableDictionary alloc] init];
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)saisieReturn :(id)sender{
    [sender resignFirstResponder];

    NSLog(@"Tabobjet avant : %@",tabObjet);
    NSLog(@"Tabobjets avant : %@",tabObjets);

    //inscription dans un dictionnaire
    [tabObjet setObject:_titreObjet.text forKey:@"Titre"];
    [tabObjet setObject:_nomPersonne.text forKey:@"Nom"];
    [tabObjet setObject:_infoContact.text forKey:@"Contact"];
    [tabObjet setObject:[NSDate date] forKey:@"DateJour"];
    [tabObjet setObject:_dateARendre.text forKey:@"DateARendre"];
    [tabObjet setObject:[NSNumber numberWithBool:NO] forKey:@"Rendu"];

    int numItems = [tabObjets count];
    [tabObjets insertObject:tabObjet atIndex:numItems];

    NSLog(@"Tabobjet apres : %@",tabObjet);
    NSLog(@"Tabobjets apres : %@",tabObjets);

    //écriture dans un fichier plist
    [tabObjets writeToFile:appFile atomically:YES];
}

@end

非常感谢您的帮助 :)

4

2 回答 2

2

你覆盖你的tabObjet. 只需在里面声明并将其saisieReturn:更改为

- (IBAction)saisieReturn :(id)sender{
    [sender resignFirstResponder];

    NSLog(@"Tabobjets avant : %@",tabObjets);

    //inscription dans un dictionnaire
    tabObjet = [[NSMutableDictionary alloc] init];
    [tabObjet setObject:_titreObjet.text forKey:@"Titre"];
    [tabObjet setObject:_nomPersonne.text forKey:@"Nom"];
    [tabObjet setObject:_infoContact.text forKey:@"Contact"];
    [tabObjet setObject:[NSDate date] forKey:@"DateJour"];
    [tabObjet setObject:_dateARendre.text forKey:@"DateARendre"];
    [tabObjet setObject:[NSNumber numberWithBool:NO] forKey:@"Rendu"];

    [tabObjets addObject:tabObjet];

    NSLog(@"Tabobjet apres : %@",tabObjet);
    NSLog(@"Tabobjets apres : %@",tabObjets);

    //écriture dans un fichier plist
    [tabObjets writeToFile:appFile atomically:YES];
}
于 2013-03-19T19:52:16.727 回答
1

这是因为每次尝试添加新字典时,您都在修改同一个可变字典。修改你的行,如:

[tabObjets insertObject:[tabObjet copy] atIndex:numItems];
于 2013-03-19T19:52:00.130 回答