J'utilise un NSArrayController
, NSMutableArray
et NSTableView
pour afficher une liste de mes propres objets personnalisés (bien que cette question s'applique probablement si vous montrez juste une liste d'objets vanillés NSString
aussi).Comment supprimer tous les éléments d'un NSTableView contrôlé par NSArrayController?
À divers moments, j'ai besoin d'effacer mon tableau et rafraîchir les données de ma source de données. Cependant, le simple fait d'appeler removeAllObjects
sur mon objet NSMutableArray
ne déclenche pas les mises à jour KVO, donc la liste à l'écran reste inchangée.
NSArrayController
a aucuneremoveAllObjects
méthode disponible, ce qui semble vraiment bizarre. (Il ne addObject
, que j'utilise pour ajouter les objets, en assurant la KVO est déclenchée et l'interface utilisateur est mis à jour.)
La façon la plus propre que j'ai réussi à faire cela se produire correctement est:
[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];
... donc je suis un peu d'avoir à faire la notification KVO moi-même manuellement (ce qui est dans mon test classe app, qui contient la propriété myArray
, qui est NSMutableArray
, comme mentionné.)
cela semble mal - est il y a une meilleure façon? De mon googling, il semble que quelques personnes sont confus par le manque de removeAllObjects
en NSArrayController
, mais n'ont pas vu de meilleures solutions.
J'ai vu cette solution:
[self removeObjectsAtArrangedObjectIndexes:
[NSIndexSet indexSetWithIndexesInRange:
NSMakeRange(0, [[self arrangedObjects] count])]];
mais cela semble encore plus désagréable pour moi. Au moins, ma solution est au moins marginalement auto-documentée.
Apple n'a-t-il pas remarqué que les utilisateurs souhaitaient parfois vider un contrôle de liste géré via un objet NSArrayController
? A part: bien sûr, si j'ajoute de nouveaux éléments à la matrice (via NSArrayController
), cela déclenche une mise à jour de KVO avec le NSArrayController/NSTableView
, mais :
- Parfois, je ne mets aucun élément dans la liste, car il n'y en a aucun. Donc, vous ne voyez que les anciens éléments.
- C'est un peu dégueulasse quand même.
Merci - cela fonctionne. J'ai changé mon code original dans ma question: [[self mutableArrayValueForKey: @ "myArray"] removeAllObjects]; et cela fonctionne bien. Beaucoup plus propre. Vous avez orthographié mutableArrayValueForKey incorrect BTW - corriger cela et je vais le marquer comme la réponse acceptée. :-) – Slacker
Votre méthode fonctionne parfaitement lorsque ArrayController est lié à un tableau. Mais cela ne fonctionne pas lorsque ArrayController n'est pas lié à un tableau. Le tableau 'content' que vous obtenez à partir de ArrayController est un' NSArray' et non 'NSMutableArray'. Utilisez simplement la méthode de ArrayController pour effacer le contenu: 'NSRange range = NSMakeRange (0, [[anArrayController arrangedObjects] count]); [unArrayController removeObjectsAtArrangedObjectIndexes: [NSIndexSet indexSetWithIndexesInRange: plage]];' – Quincy
@Quincy Le '' 'NSRange'' 'la solution est significativement plus rapide que la réponse d'origine ou' '' ['anArrayController removeObjects: [unArrayController arrangedObjects]]' ''. Merci! – bdunagan