Wie soll ich alle Elemente aus einem NSTableView entfernen, das von NSArrayController gesteuert wird?

7

Ich verwende NSArrayController , NSMutableArray und NSTableView , um eine Liste meiner eigenen benutzerdefinierten Objekte anzuzeigen (obwohl diese Frage wahrscheinlich zutrifft, wenn Sie nur eine Liste von vanilla NSString -Objekten anzeigen) .

Zu verschiedenen Zeitpunkten muss ich mein Array löschen und die Daten aus meiner Datenquelle aktualisieren. Der Aufruf von removeAllObjects für mein NSMutableArray -Objekt löst jedoch keine KVO-Aktualisierungen aus, sodass die Liste auf dem Bildschirm unverändert bleibt.

NSArrayController hat no removeAllObjects -Methode verfügbar, was wirklich seltsam erscheint. (Es hat addObject , die ich verwende, um die Objekte hinzuzufügen, sicherzustellen, dass die KVO ausgelöst wird und die Benutzeroberfläche aktualisiert wird.)

Die sauberste Art und Weise, dies zu erreichen, ist:

%Vor%

... also muss ich selbst die KVO-Benachrichtigung manuell machen (dies ist in meiner Test-App-Klasse, die die myArray -Eigenschaft enthält, die, wie erwähnt, NSMutableArray ist.)

Das scheint falsch - gibt es einen besseren Weg? Von meinem Googeln scheint es, dass einige Leute durch das Fehlen von removeAllObjects in NSArrayController verwirrt sind, aber keine besseren Lösungen gesehen haben.

Ich habe diese Lösung gesehen:

%Vor%

aber das sieht mir noch unangenehmer an. Zumindest ist meine Lösung zumindest marginal selbstdokumentierend.

Hat Apple nicht bemerkt, dass Leute manchmal ein Listensteuerelement leeren möchten, das über ein NSArrayController -Objekt verwaltet wird? Das scheint ziemlich offensichtlich zu sein, also denke ich, dass ich etwas verpassen muss ...

Nebenbei, natürlich, wenn ich neue Elemente zum Array hinzufüge (über NSArrayController ), löst dies ein KVO-Update mit dem NSArrayController/NSTableView aus, aber:

  1. Manchmal lege ich keine Gegenstände in die Liste, weil es keine gibt. Du siehst also nur die alten Gegenstände.
  2. Das ist sowieso ein bisschen eklig.
Slacker 14.03.2009, 21:39
quelle

4 Antworten

16

Sie entfernen keine Objekte aus einer Tabellenansicht. Es enthält keine Elemente. Es werden nur die Objekte eines anderen Objekts angezeigt.

Wenn Sie die Content-Array-Bindung des Array-Controllers an eine Array-Eigenschaft eines anderen Objekts binden, sollten Sie mit dieser Eigenschaft dieses Objekts arbeiten. Verwende [[object mutableArrayValueForKey:@"property"] removeAllObjects] .

Wenn Sie andererseits die Content-Array-Bindung des Array-Controllers nicht gebunden haben, müssen Sie direkt mit seinem content interagieren. Verwende [[arrayController mutableArrayValueForKey:@"content"] removeAllObjects] . (Sie könnten auch mit arrangedObjects anstelle von content arbeiten. Wenn einer nicht funktioniert, versuchen Sie den anderen - ich habe die Dinge nur auf die erste Art gemacht, indem ich den Array-Controller an etwas anderes gebunden habe.)

    
Peter Hosey 14.03.2009, 23:38
quelle
3

Hatte auch dieses Problem und löste es so:

%Vor%     
neoneye 15.08.2009 20:16
quelle
1

Schnell

%Vor%

hat für mich funktioniert.

    
Peter 17.01.2016 22:36
quelle
0

Lösung in Swift:

%Vor%     
BadmintonCat 02.05.2015 09:39
quelle

Tags und Links