Comment dois-je supprimer tous les éléments d'un NSTableView contrôlé par NSArrayController?

StackOverflow https://stackoverflow.com/questions/646787

  •  22-07-2019
  •  | 
  •  

Question

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 ne faites que montrer une liste d'objets NSString vanilles également).

À différents moments, je dois vider mon tableau et actualiser 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 du KVO. La liste à l'écran reste donc inchangée.

NSArrayController a la méthode non removeAllObjects , ce qui semble vraiment étrange. (Il contient addObject , que j'utilise pour ajouter les objets, en s'assurant que le KVO est déclenché et que l'interface utilisateur est mise à jour.)

La manière la plus propre que j'ai pu faire pour que cela se produise correctement est:

[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];

... je suis donc obligé de faire moi-même la notification KVO manuellement (c'est dans ma classe d'application de test, qui contient la propriété myArray , qui est NSMutableArray , comme mentionné.)

Cela semble faux - existe-t-il un meilleur moyen? D'après ma recherche sur Google, il semble que peu de gens soient troublés par le manque de removeAllObjects dans NSArrayController , mais ils n'ont pas trouvé de meilleures solutions.

J'ai vu cette solution:

[self removeObjectsAtArrangedObjectIndexes:
  [NSIndexSet indexSetWithIndexesInRange:
    NSMakeRange(0, [[self arrangedObjects] count])]];

mais cela me semble encore plus désagréable. Au moins ma solution est au moins marginalement auto-documentée.

Apple n'a-t-elle pas remarqué que, parfois, les utilisateurs pourraient vouloir vider un contrôle de liste géré via un objet NSArrayController ? Cela semble assez évident, alors je pense que je dois rater quelque chose ...

A part: bien sûr, si j'ajoute de nouveaux éléments au tableau (via NSArrayController ), cela déclenche une mise à jour KVO avec le NSArrayController / NSTableView , mais:

  1. Parfois, je ne mets aucun élément dans la liste, car il n'y en a pas. Donc, vous venez de voir les anciens articles.
  2. C'est quand même un peu dégueu.
Était-ce utile?

La solution

Vous ne supprimez pas les éléments d'une vue sous forme de tableau. Il ne contient aucun élément. Il affiche simplement les éléments d'un autre objet.

Si vous avez lié la liaison du tableau de contenu du contrôleur de tableau à une propriété de tableau d'un autre objet, vous devriez alors utiliser cette propriété de cet objet. Utilisez [[object mutableArrayValueForKey: @ "propriété"] removeAllObjects] .

Si, en revanche, vous n'avez pas lié la liaison de contenu du contrôleur de tableau, vous devez interagir directement avec son contenu . Utilisez [[arrayController mutableArrayValueForKey: @ "contenu"] removeAllObjects] . (Vous pouvez aussi travailler avec arrangementObjects au lieu de contenu . Si l'un ne fonctionne pas, essayez l'autre - je n'ai jamais fait les choses de la première manière, en liant le tableau contrôleur à autre chose.)

Autres conseils

Ce problème aussi a été résolu de cette façon:

NSArrayController* persons = /* your array controller */;
[[persons content] removeAllObjects];

Swift

@IBOutlet var acLogs: NSArrayController!

acLogs.removeObjects(acLogs.content as! [AnyObject])

a travaillé pour moi.

Solution dans Swift:

if let ac = arrayController
{
    let range:NSRange = NSMakeRange(0, ac.arrangedObjects.count);
    let indexSet:NSIndexSet = NSIndexSet(indexesInRange: range);
    ac.removeObjectsAtArrangedObjectIndexes(indexSet);
}

Juste une mise à jour qui fonctionne dans Swift 4:

let range = 0 ..< (self.arrayController.arrangedObjects as AnyObject).count
self.arrayController.remove(atArrangedObjectIndexes: IndexSet(integersIn: range))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top