2010-06-12 3 views
1

J'ai une question concernant l'utilisation de méthodes compatibles KVO pour insérer/supprimer des objets d'un tableau. Je travaille par Aaron Hillegass de Programmation Cocoa pour Mac OS X et je vis la ligne de code suivante (dans la méthode insertObject:inEmployeesAtIndex::Différence entre mutableArrayValueForKey et appel insertObject: inEmployeesAtIndex: directement

[[undoManager prepareWithInvocationTarget:self] removeObjectFromEmployeesAtIndex:index]; 

-moi si je me trompe, mais je toujours pensé qu'il valait mieux appeler mutableArrayValueForKey: puis removeObjectAtIndex: ... donc j'essayé de changer la ligne ci-dessus à ceci:.

[[undoManager prepareWithInvocationTarget:[self mutableArrayValueForKey:@"employees"]] removeObjectAtIndex:index]; 

et ça n'a pas quelqu'un peut-il expliquer la différence et pourquoi la première ligne fonctionne, mais la deuxième ligne n » t?

UP DATE: Mon removeObjectFromEmployeesAtIndex: méthode d'index est implémentée pour rendre ma classe de collection (une instance de NSMutableArray) compatible KVC. Donc, finalement, appeler [[self mutableArrayValueForKey:@"employees"] removeObjectAtIndex:index]; devrait finir par appeler [self removeObjectFromEmployeesAtIndex:index];

Répondre

1

Dans votre mise à jour vous dites:

appelant [[self mutableArrayValueForKey: @ "employés"] removeObjectAtIndex: index]; devrait finir par appeler [self removeObjectFromEmployeesAtIndex: index];

Malheureusement, ce n'est pas correct, peu importe ce que contient votre méthode removeObjectFromEmployeesAtIndex: car NSMutableArray n'appellera jamais de méthodes dans votre classe. Puisque vous semblez essayer d'obtenir la fonctionnalité annuler/rétablir, vous devez utiliser une méthode comme removeObjectFromEmployeesAtIndex:. Sinon, lorsque vous appuyez sur Annuler pour ajouter un employé, vous n'avez aucun moyen de «rétablir» l'ajout de cet employé. Vous pourriez également avoir des problèmes avec annuler/refaire pour les modifications à des employés individuels. Si vous vouliez vous pourriez changer la ligne dans la méthode removeObjectFromEmployeesAtIndex: qui lit [employees removeObjectAtIndex:index]; à [[self valueForKey:@"employees"] removeObjectAtIndex:index]; ou [self.employees removeObjectAtIndex:index]; mais il n'y a vraiment aucune raison d'aller cette route.

0

Oui. La première ligne (du livre) est essentiellement équivalent à ceci:

id tmp = [undoManager prepareWithInvocationTarget:self]; 
[tmp removeObejctFromEmployeesAtIndex:index]; 

Votre code, cependant, est essentiellement équivalent à ceci:

id tmp1 = [self mutableArrayValueForKey:@"employees"]; 
id tmp2 = [undoManager prepareWithInvocationTarget:tmp1]; 
[tmp2 removeObjectAtIndex:index]; 

En d'autres termes, l'objectif que vous vous préparez l'invocation avec est différente dans votre code (sauf si self se trouve être le même objet que [self mutableArrayValueForKey:@"employees"], ce qui est douteux).

+0

Oh, désolé pour la confusion. J'ai mis à jour le poste avec plus de détails. Mais en fait, je veux appeler -removeObjecAtIndex: sur [self mutableArrayValueForKey: @employees "] – jasonbogd

Questions connexes