J'avais une application de navigation qui fonctionnait normalement. Dans la vue de table, le dernier élément est appelé "ajouter un élément", et si l'utilisateur le pressait, il créerait un nouvel objet et le passerait à une autre vue où l'utilisateur pourrait entrer les détails pour cet objet. Lorsque l'utilisateur revenait à l'écran précédent, le nouvel objet s'affichait dans le tableau qui était affiché dans la table.Modifier un objet dans un NSMutableArray modifie également un autre objet dans le NSMutableArray
Je l'ai modifié pour que le champ "ajouter un élément" soit toujours le premier champ de la table, pas le dernier. J'ai fait les changements appropriés pour que le tableau s'affiche correctement sur la table. Cependant, maintenant je remarque un comportement étrange.
Si j'édite le premier objet du tableau, le septième objet change également pour être identique à cet objet. Si je modifie le deuxième objet dans le tableau, les quatrième et sixième objets changent également pour être identiques. Si je modifie le troisième élément dans le tableau, le cinquième objet change pour être le même.
Que pourrait-il se passer?
Dans la viewDidLoad: méthode que j'initialiser l'objet comme ceci:
PersonDetails *personDetails = [[PersonDetails alloc] init];
Ceci est la méthode qui est exécuté lorsqu'un utilisateur sélectionne une ligne sur la table
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic may go here. Create and push another view controller.
updatePersonArray = YES;
arrayIndex = indexPath.row-1;
editPerson = [[EditClassController alloc] initWithNibName:@"EditPerson" bundle:nil];
editPerson.title = @"Edit Person";
if (arrayIndex != -1) {
personDetails = [classArray objectAtIndex:arrayIndex];
}
else {
personDetails = [[PersonDetails alloc] init];
}
editPerson.personDetails = personDetails;
[self.navigationController pushViewController:editPerson animated:YES];
[editPerson release];
}
Voici à quoi ressemble viewWillAppear. Il mettra à jour la table après qu'un objet a été modifié.
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if ([personDetails isEmpty]) {
updatePersonArray = NO;
}
if (updatePersonArray) {
if (arrayIndex == -1) {
NSLog(@"adding new object to array");
[personArray addObject:personDetails];
}
else {
NSLog(@"replacing object at index %d", arrayIndex);
[personArray replaceObjectAtIndex:arrayIndex withObject:personDetails];
}
[self saveArrayToDisk];
[self.tableView reloadData];
updatePersonArray = NO;
}
else {
//load the array from disk
NSLog(@"loading array from disk");
NSData *theData = [[NSUserDefaults standardUserDefaults] objectForKey:@"personArray"];
if (theData != nil) {
NSLog(@"found something");
personArray = [[NSMutableArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:theData]];
}
else {
personArray = [[NSMutableArray alloc] init];
}
}
}
Edit: je résoudre le problème en mettant en œuvre NSCopy pour l'objet personne, puis faire une copie de l'objet à partir du tableau au lieu de pointer directement à l'objet dans le tableau. Quelqu'un sait pourquoi cela a résolu le problème?
peut-être pourriez-vous montrer du code? semble que vous ne créez pas les objets et référencez plutôt le même objet dans le tableau. –
J'ai créé des copies d'objets dans le tableau et cela a résolu le problème. –