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

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

  •  22-07-2019
  •  | 
  •  

Frage

Ich verwende eine NSArrayController, NSMutableArray und NSTableView eine Liste meiner eigenen benutzerdefinierten Objekte zu zeigen (auch wenn diese Frage gilt wahrscheinlich, wenn Sie nur eine Liste von Vanille NSString zeigen Objekte auch).

Zu verschiedenen Zeitpunkten, muss ich meine Array löschen und die Daten aus meiner Datenquelle zu aktualisieren. Allerdings nur removeAllObjects auf meinem NSMutableArray Objekt ruft nicht die KVO-Updates auslösen, so dass die Liste auf dem Bildschirm bleibt unverändert.

NSArrayController hat nicht removeAllObjects Methode zur Verfügung, die wirklich seltsam scheint. (Es tut addObject, die ich verwende, um die Objekte hinzufügen, die KVO sicherzustellen ausgelöst wird und die Benutzeroberfläche aktualisiert wird.)

Der sauberste Weg, ich habe es geschafft, zu dieser korrekt ist geschehen zu verursachen:

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

... also ich habe Art die KVO Benachrichtigung manuell selbst zu tun (in meiner Test-App-Klasse, die die myArray Eigenschaft enthält, die NSMutableArray ist, wie bereits erwähnt).

Das scheint falsch - gibt es einen besseren Weg? Von meinem googeln es ein paar Leute durch den Mangel an removeAllObjects in NSArrayController sind verwirrt scheint, aber haben keine besseren Lösungen gesehen.

Ich habe diese Lösung gesehen:

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

aber das sieht noch unangenehmer zu mir. Wenigstens meine Lösung ist zumindest geringfügig selbsterklärend.

Haben von Apple nicht bemerkt, dass manchmal Leute könnten eine Liste Steuerung wird über ein NSArrayController Objekt verwaltet leeren möchten? Dies scheint ziemlich offensichtlich, so dass ich glaube, ich muss etwas fehlt ...

Neben: natürlich, wenn ich neue Elemente zum Array hinzufügen (via NSArrayController), dann löst dies ein KVO-Update mit dem NSArrayController/NSTableView, aber:

  1. Manchmal habe ich keine Elemente in der Liste, weil es keine gibt. Also nur die alten Elemente sehen.
  2. Das ist ein bisschen eklig trotzdem.
War es hilfreich?

Lösung

Sie nicht entfernen Elemente aus einer Tabellenansicht. Es hat keine Artikel-es nur ein weiteres Element des Objekts zeigt.

Wenn Sie den Array-Controller Inhalt Array Bindung an eine Array-Eigenschaft von einem anderen Objekt gebunden ist, dann sollten Sie mit dieser Eigenschaft des Objekts arbeiten. Verwenden Sie [[object mutableArrayValueForKey:@"property"] removeAllObjects].

Wenn auf der anderen Seite haben Sie nicht den Array-Controller Inhalt Array-Bindung gebunden ist, dann müssen Sie mit seinem content direkt zu interagieren. Verwenden Sie [[arrayController mutableArrayValueForKey:@"content"] removeAllObjects]. (Sie können auch statt arrangedObjects mit content arbeiten. Wenn man nicht funktioniert, versuchen Sie die andere-ich habe immer nur Dinge getan, die erste Möglichkeit, die Bindung der Array-Controller auf etwas anderes.)

Andere Tipps

Wir hatten dieses Problem auch und löste es auf diese Weise:

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

Swift

@IBOutlet var acLogs: NSArrayController!

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

für mich gearbeitet.

Lösung in Swift:

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

Nur ein Update, das in Swift 4 funktioniert:

let range = 0 ..< (self.arrayController.arrangedObjects as AnyObject).count
self.arrayController.remove(atArrangedObjectIndexes: IndexSet(integersIn: range))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top