Bindings am Beispiel von NSTableView

  • Ja genau ein NSArray mit Dictionaries würde sicherlich noch weiter zum Verständnis helfen Objcler.

    Sorry Tom aka. Amin. Da war ich wohl noch nicht ganz am Ende des Kapitels. Du hast natürlich recht. Da kommt dann noch so ein kleines NSTableView-Beispiel. Ich werd' das jetzt mal testen. Unter Umständen reicht das schon zum Verständnis :)

    Marco
  • Ja siehste mal. Wer lesen kann ist klar im Vorteil. Die Seiten 518 bis 524 enthielten das ganze Geheimnis. Nun muß ich mir also nur noch ein passendes Model überlegen, damit meine Daten mit dem Controller wie von Geisterhand ohne wirklich etwas programmieren zu müssen im NSTableView angezeigt werden. Ist wirklich genial, wieviel Arbeit die Bindings ersparen.

    Vielen Dank
    Marco
  • Original von m99
    Ja siehste mal. Wer lesen kann ist klar im Vorteil. Die Seiten 518 bis 524 enthielten das ganze Geheimnis. Nun muß ich mir also nur noch ein passendes Model überlegen, damit meine Daten mit dem Controller wie von Geisterhand ohne wirklich etwas programmieren zu müssen im NSTableView angezeigt werden. Ist wirklich genial, wieviel Arbeit die Bindings ersparen.

    Vielen Dank
    Marco

    *g* Und jetzt habe ich den gleichen Fehler gemacht: Ich hätte zuerst deine weiteren Beiträge lesen sollen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Objcler
    Original von m99
    Eins nach dem anderen. Sonst ist die ganze Spannung mit einem Mal raus ;)


    Spannung mehrmal aufbauen und dann kommen lassen hat wirklich was. :)

    Wir sollten jetzt aber nicht unsere privaten Sexpraktiken hier ausbreiten.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Tom9811
    Original von Objcler
    Original von m99
    Eins nach dem anderen. Sonst ist die ganze Spannung mit einem Mal raus ;)


    Spannung mehrmal aufbauen und dann kommen lassen hat wirklich was. :)

    Wir sollten jetzt aber nicht unsere privaten Sexpraktiken hier ausbreiten.


    Ich sprach nicht von Sexpraktiken. :(

    Bin doch eh asexuell.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Zurück zum Thema meine Herren.

    Ich schildere einfach mal den Aufbau meines Testprogramms. Es gibt als zentrales Element einen NSPopUpButton, der die Schriftliste des Systems enthält. Bei der Auswahl einer Schrift werden in einem NSTabView zwei NSTableViews aktualisiert - oder sollen das zumindest in Zukunft über die Data Bindings.

    Auf der Datenseite gibt es eine Klasse FontCollection mit einem NSSet* von Objekten der Klasse Font. Ein Font wiederum besteht aus einem Objekt der Klasse FontOffsetTable und einem NSSet* von Objekten der Klasse FontTableDirectory.

    Das NSTabView besteht aus den beiden NSTableViews »Offset Table« und »Table Directories«. In Offset Table werden einfach fünf Schlüssel in der linken und ihre entsprechenden fünf Werte in der rechten Spalte angezeigt. Table Directories zeigt die in der Schriftdatei enthaltenen Tabellen mit ihrem Kürzel, ihrer Prüfsumme, ihrem Offset und ihrer Länge an. Das ist eigentlich auch schon alles :)

    Die Daten habe ich bereits alle eingelesen, doch wie binde ich jetzt die NSArrayControllers usw. für die Nutzung der Data Bindings richtig ein. Klassische Getter und Setter sind vorhanden.

    Marco
  • Nichts leichter als das.

    Dein Set mit Fonts wird zum content des ArrayControllers (mit setContent: oder via dem content Binding des Array Controllers). Die Klasse des ArrayController ist gleich der Klasse der Font Objekte.

    Das war die ArrayController Seite.
    Nun kannst du die Columns der TableViews binden.

    Binding: value
    Controller: der ArrayController
    KeyPath: arrangedObjects.einKeyEinerFont
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Ich habe jetzt zwei ArrayController. Einer für die Offset Table (über contentObject verbunden mit der Instanz der Hauptklasse) und einer für die Table Directories (über contentSet verbunden mit der Instanz der Hauptklasse). Nun erhalte ich aber beim Programmstart immer die Fehlermeldung, daß die Schlüssel nicht Key-Value-Coding-kompatibel sind. Klassische Getter und Setter existieren aber.

    Persönlich habe ich ja den Verdacht, daß für meine Datenstruktur noch der ein oder andere Controller fehlt :) Wie bereits beschrieben, hat die Instanz der Hauptklasse ein Objekt des Typs FontCollection. Die FontCollection wiederum ein NSSet* von Fonts und ein Objekt Font besteht aus einem Objekt OffsetTable und einem NSSet* von TableDirectories.

    Weiß jemand einen Rat?

    Marco
  • Kleine Änderung:

    1. FontCollectionController (für Klasse FontCollection als ObjectController) verbunden mit der Instanz der Hauptklasse über content-Verbindung
    2. FontController (für Klasse Font als ArrayController) verbunden mit FontCollectionController über content-Verbindung
    3. FontOffsetTableController (für Klasse FontOffsetTable als ObjectController) verbunden mit FontController über content-Verbindung
    4. FontTableDirectoriesController (für Klasse FontTableDirectory als ArrayController) verbunden mit FontController über content-Verbindung

    Das macht für mich jetzt mehr Sinn. Ist doch eigentlich nichts gegen auszusetzen oder? Dennoch bekomme ich einen Fehler beim Binding des FontOffsetTableControllers, der mit dem FontController »gebindet« ist über den Controller Key »selection« und den Model Key Path »offsetTable« (als Attribut in der Klasse Font mit klassischen Settern und Gettern vertreten).

    Marco
  • Kannst du dazu ein kleines Beispiel hochladen oder mit einfachen Begriffen erklären, was du willst? :)

    Du hast ein Objekt (deine Hauptinstanz), welches ein "FontCollection" Objekt hat. Dieses hat eine Collection von Fontobjekten. Richtig?

    Ein Fontobjekt besteht aus einen Objekt "OffsetTable" und einem NSSet von TableDirectories. Richtig?

    Nun zu deinen "Aussagen":

    "1. FontCollectionController (für Klasse FontCollection als ObjectController) verbunden mit der Instanz der Hauptklasse über content-Verbindung"

    Naja - du hast als Klasse "FontCollection" und verbindest den Controller mit der Hauptinstanz? Das kann nicht klappen. Das contentObjekt muss ein Objekt der definierten Klasse sein. Du könntest das mit dem "contentBinding" des FontCollectionControllers erledigen - einfach binden an: Haupinstanz. FontCollection

    "2. FontController (für Klasse Font als ArrayController) verbunden mit FontCollectionController über content-Verbindung"

    Ich würde das Contentbinding des FontControllers direkt an "Hauptinstanz. FontCollection" binden und dafür den FontCollectionController entfernen.

    "3. FontOffsetTableController (für Klasse FontOffsetTable als ObjectController) verbunden mit FontController über content-Verbindung"

    siehe 1. Lösung: contentbinding binden an FontController.selection

    "4. FontTableDirectoriesController (für Klasse FontTableDirectory als ArrayController) verbunden mit FontController über content-Verbindung"

    ????
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Meine Hauptinstanz hat ein NSSet* von Font-Objekten, ansonsten ist das richtig, was du geschrieben hast. Ich glaube mittlerweile, daß das Problem der NSPopUpButton ist, der ja die Schriftauswahl trifft. Denn den habe ich in dem ganzen Planspiel noch garnicht betrachtet. Die Bindings können ja bisher nicht wissen, zu welchem Font-Objekt aus dem NSSet* sie die Daten binden sollen.

    Marco
  • Original von m99
    Meine Hauptinstanz hat ein NSSet* von Font-Objekten, ansonsten ist das richtig, was du geschrieben hast. Ich glaube mittlerweile, daß das Problem der NSPopUpButton ist, der ja die Schriftauswahl trifft. Denn den habe ich in dem ganzen Planspiel noch garnicht betrachtet. Die Bindings können ja bisher nicht wissen, zu welchem Font-Objekt aus dem NSSet* sie die Daten binden sollen.

    Marco


    Falls du nicht extra für mich/uns ein kleines Testprojekt hochladen willst könntest du auch einfach ein Screenshot anhängen welcher den momentanen Status zeigt. Das hilft mir persönlich meist sehr. Für mich ergeben sich dann meist die Einstellungen für die Bindings.

    Bindings + NSPopupButton ist so eine Geschichte - insbesondere was das selectedObject-Binding angeht.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].