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:
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.)