2015-07-09 4 views
5

Was ist die effizienteste Möglichkeit, alle Objekte einer bestimmten Klasse in einem NSOutlineView zu erweitern? (Die Datenquelle meiner Gliederungsansicht ist eine NSTreeController).NSOutlineView: Erweitern Sie alle Objekte einer bestimmten Klasse nur

Sagen wir, ich

classA 
classA 
    - classA 
     - classC 
     - classC 
    - classB 
     - classC 
     - classC 
classB 
    - classC 

habe ich möchte nur classA Objekte erweitern. Muss ich die gesamten drei Schritte durchlaufen, um zu prüfen, welche Klasse zu welchem ​​Objekt gehört?

UPDATE Tut mir leid, ich muss eine Korrektur vornehmen. Die outlineView-Objekte sind NSTreeNodes aus der NSTreeController-Datenquelle. Und nur das "reprodedObject" sind meine benutzerdefinierten Klassen.

Die Struktur mit diesen Klassen ist also korrekt, aber sie sind nicht direkt als Knoten der Gliederungsansicht zugänglich.

Antwort

2

Für was es wert ist, ist der wichtige "Klebstoff", den ich in dem Kommentar erwähnte, mehr oder weniger direkt aus diesem tollen Blog-Post: Saving the expand state of a NSOutlineView.

Ich nahm alle Klassen in meinem Baum und machte sie Subklassen einer abstrakten Klasse mit einer expanded Eigenschaft, so jeden representedObject in einem NSTreeNode hat expanded als Eigenschaft.

Aber Sie müssen möglicherweise nicht einmal das tun, wenn Sie expanded in Ihrem Datenmodell nicht beibehalten möchten.

Die einfache Sache zu tun ist, um nur die Zeilen iterieren:

for (NSUInteger row = 0; row < [outlineView numberOfRows]; row++) 
    { 
     // Expand item if it's an classA 
     NSTreeNode* treeNode = [outlineView itemAtRow:row]; 
     if ([treeNode.representedObject isKindOfClass:[ClassA class]]) 
      [sender.animator expandItem:treeNode]; 
    } 

... Sie werden feststellen, dass für Schleife bemerken viel Struktur aus dem Blog-Eintrag verwiesen leiht.

Also ich denke, meine Antwort ist ein fauler, "Ja, iterieren Sie den ganzen Baum." Zumindest der angezeigte Baum.

EDIT: Für diejenigen, die ein bisschen übereifrig über MVC sind, fühle ich mich jetzt ist es notwendig, zu spezifizieren, dass der obige Code in der Klasse sein, sollten Sie als NSOutlineView-Controller verwenden, die in der Regel <NSOutlineViewDelegate>

+1

Entschuldigung, ich muss eine Korrektur vornehmen.Die outlineView-Objekte sind NSTreeNodes aus der NSTreeController-Datenquelle. Und nur das "reprodedObject" sind meine benutzerdefinierten Klassen. Daher kann ich diesen Objekten keine Eigenschaften hinzufügen, da ich die Knoten nicht unterklassiere. – aneuryzm

+1

@Patrick - Einfach die Zeilen zu iterieren ist die einfache Sache, also sollte man bei der Kopfgeldausgabe angeben, dass O (Zeilen) es nicht schneidet. Ich denke immer noch, dass der NSTreeNode-Wrapper keine große Hürde für das Obige darstellt, aber ich muss bei meinem alten Code nach dem Kleber schielen. – stevesliva

-1
implementieren würde

Muss ich die gesamten drei Schritte durchlaufen, um zu überprüfen, welche Klasse zu welchem ​​Objekt gehört?

Ja, weil das ist, was Sie tun möchten.

Aber es ist nicht so einfach wie in der A von stevesliva:

A. Sie nicht über die Elemente der Gliederungsansicht durchlaufen sollte. Es ist eine Aussicht. Es hat nichts mit den Daten zu tun. Wenn beispielsweise ein Knoten geschlossen ist, sind die Nachkommen in der Zeilenliste nicht. Dies liegt daran, dass es für sie keine Zeile gibt.

B. Stattdessen iterieren Sie über den Inhalt des Tree-Controllers. Controller sind für den Datenzugriff ausgelegt und somit der richtige Ort für den Datenzugriff. -arrangedObjects (NSTreeController) gibt Ihnen Zugriff auf den Inhalt.

+1

Es ist so einfach wie die Antwort von stevesilva, weil es keinen Hinweis darauf gibt, dass das OP Knoten erweitern möchte, die * 'classA' Objekte enthalten, sondern nur solche, die *' classA' Objekte sind. Wenn ein "classA" -Objekt innerhalb eines "classB" -Objekts ist, das kollabiert ist, spielt es keine Rolle, ob dieses "classA" -Objekt "expanded" oder "collapsed" ist. Das hat keine besondere Bedeutung. Es reicht also aus, die Reihen zu gehen und diejenigen zu erweitern, die "Klasse A" sind. –

+1

Es gibt einen Hinweis: "um ** alle ** Objekte einer bestimmten Klasse zu erweitern". Abgesehen davon ist es ein methodisch falscher Ansatz, um eine Ansicht für die Daten wie erwähnt zu fragen. –

+1

@ AminNegm-Awad - Ich denke, Sie fesseln sich unnötigerweise unnötig, wenn Sie denken, dass Sie eine Ansicht nicht abfragen können, wenn Sie versuchen, die Ansicht und nicht das Modell effizient zu modifizieren. Es ist vergleichbar mit der Deklaration, dass Sie nicht alle Subviews einer Ansicht mit dem View-Hierarchie-Code löschen können, was lächerlich wäre. Controller haben eine schwache Eigenverantwortung für ihre View-Outlets, da die Views die Ansichtshierarchie in Besitz nehmen, und Sie dürfen die View-Hierarchie mit Sicherheit durchqueren, wenn Sie die Anzeige ändern. – stevesliva

Verwandte Themen