Hallo zusammen,
gestern Abend hatte ich eine ganz einfache Aufgabenstellung. Ich wollte eine Baum-Hierarchie in einem NSBrowser anzeigen lassen. Die Hierarchie besteht aus zwei Ebenen. Die erste Ebene enthält Kategorien (Strings) und die zweite Ebene Unterkategorien (ebenfalls Strings):
Kategorie 1
Unterkategorie 1.1
Unterkategorie 1.2
Kategorie 2
Unterkategorie 2.1
...
Stundenlang habe ich gesucht, wie man einen NSBrowser an einen NSTreeController bindet. Gefunden habe ich fast ausschließlich Lösungen, die alle ein NSOutlineView an einen NSTreeController binden und dabei extrem viel Glue-Code erzeugen. Dokumentation von Apple gibt es dazu rein gar nichts. Jedenfalls habe ich nichts gefunden. Der Glue-Code kommt daher, da viele Programmierer ihre Bäume mit selbst programmierten TreeNodes realisieren und diese TreeNodes korrekt mit dem NSTreeController kommunizieren können müssen. Dabei gibt es, zumindestens in MacOS 10.5, eine NSTreeNode-Klasse, das Nutzdaten-Objekte (representedObject) unterstützt. Das muss allerdings erstmal herausfinden. Es ist daher ausreichend eine Nutzdaten-Klasse zu schreiben. In meinem Fall eine Kategorieklasse.
Glücklicherweise bin ich heute morgen auf einen Blog gestossen, der auf sehr einfache Art und Weise zeigt, wie man einen NSTreeController an ein MSMutableArray mit NSTreeNodes bindet und anschließend die Hierarchie in einem NSOutlineView anzeigt: designedrecreations.blogspot.c…oller-and-nstreenode.html
Doch wie geht das nun, wenn man zur Anzeige einen NSBrowser anstelle der NSOutlineView verwenden möchte? Nach langem ausprobieren habe ich herausgefunden, dass folgende Schritte durchzuführen sind:
1. Der Content des NSBrowser muss an den NSTreeController gebunden werden. Der Controller Key ist dabei arrangeObjects und der Model Key Path bleibt leer.
2. Content Values des NSBrowser muss ebenfalls an den NSTreeController gebunden werden. Der Controller Key ist auch arrangeObjects und der Model Key Path ist representedObject.name (Hinweis: representedObject enthält eine Instanz einer selbst geschriebenen Nutzerdaten-Klasse mit Property name).
Nach diesen Schritten hat es endlich funktioniert. Lässt man einen der beiden Schritte weg funktioniert nichts. Gerade die Notwendigkeit von Schritt 1 ist für mich nicht einsichtig.
Fazit:
Ich finde die Binding-Geschichte von Cocoa insgesamt doch recht unintuitiv, undurchsichtig und dazu schlecht dokumentiert. Kennt jemand vielleicht ein gutes Buch oder auch eine gute Webseite, in der die Binding-Thematik mal genauer betrachtet wird? Insbesondere würde ich gerne wissen, wie die Bindings für die einzelnen UI-Elemente definiert werden müssen. Man kann ja schließlich nicht jedesmal raten.
Viele Grüße
gestern Abend hatte ich eine ganz einfache Aufgabenstellung. Ich wollte eine Baum-Hierarchie in einem NSBrowser anzeigen lassen. Die Hierarchie besteht aus zwei Ebenen. Die erste Ebene enthält Kategorien (Strings) und die zweite Ebene Unterkategorien (ebenfalls Strings):
Kategorie 1
Unterkategorie 1.1
Unterkategorie 1.2
Kategorie 2
Unterkategorie 2.1
...
Stundenlang habe ich gesucht, wie man einen NSBrowser an einen NSTreeController bindet. Gefunden habe ich fast ausschließlich Lösungen, die alle ein NSOutlineView an einen NSTreeController binden und dabei extrem viel Glue-Code erzeugen. Dokumentation von Apple gibt es dazu rein gar nichts. Jedenfalls habe ich nichts gefunden. Der Glue-Code kommt daher, da viele Programmierer ihre Bäume mit selbst programmierten TreeNodes realisieren und diese TreeNodes korrekt mit dem NSTreeController kommunizieren können müssen. Dabei gibt es, zumindestens in MacOS 10.5, eine NSTreeNode-Klasse, das Nutzdaten-Objekte (representedObject) unterstützt. Das muss allerdings erstmal herausfinden. Es ist daher ausreichend eine Nutzdaten-Klasse zu schreiben. In meinem Fall eine Kategorieklasse.
Glücklicherweise bin ich heute morgen auf einen Blog gestossen, der auf sehr einfache Art und Weise zeigt, wie man einen NSTreeController an ein MSMutableArray mit NSTreeNodes bindet und anschließend die Hierarchie in einem NSOutlineView anzeigt: designedrecreations.blogspot.c…oller-and-nstreenode.html
Doch wie geht das nun, wenn man zur Anzeige einen NSBrowser anstelle der NSOutlineView verwenden möchte? Nach langem ausprobieren habe ich herausgefunden, dass folgende Schritte durchzuführen sind:
1. Der Content des NSBrowser muss an den NSTreeController gebunden werden. Der Controller Key ist dabei arrangeObjects und der Model Key Path bleibt leer.
2. Content Values des NSBrowser muss ebenfalls an den NSTreeController gebunden werden. Der Controller Key ist auch arrangeObjects und der Model Key Path ist representedObject.name (Hinweis: representedObject enthält eine Instanz einer selbst geschriebenen Nutzerdaten-Klasse mit Property name).
Nach diesen Schritten hat es endlich funktioniert. Lässt man einen der beiden Schritte weg funktioniert nichts. Gerade die Notwendigkeit von Schritt 1 ist für mich nicht einsichtig.
Fazit:
Ich finde die Binding-Geschichte von Cocoa insgesamt doch recht unintuitiv, undurchsichtig und dazu schlecht dokumentiert. Kennt jemand vielleicht ein gutes Buch oder auch eine gute Webseite, in der die Binding-Thematik mal genauer betrachtet wird? Insbesondere würde ich gerne wissen, wie die Bindings für die einzelnen UI-Elemente definiert werden müssen. Man kann ja schließlich nicht jedesmal raten.
Viele Grüße
