Hallo,
die “Bindingstechnologie” ist für viele (für mich eingeschlossen) noch ein etwas magisch wirkendes Gebilde. Leute wie Tom sorgen mit all ihrer Kraft für Aufklärung auf diesem Gebiet - erklären immer wieder, dass Bindings eigentlich nur KVC/KVO in Komibination sind. Dennoch bleibt - zumindest bei mir - immer ein Rest, der ungeklärt bleibt. Es wäre wohl ganz sinnvoll Bindings mal ein einem komplexen aber konkreten Beispiel wie NSTableView zu erklären.
Die Frage ist: Wie kommen die Daten (via Bindings) in die TableView, wie werden die Änderungen “bekannt” gegeben, wie die SelectionIndexes gemanaged usw. Diese Fragen habe ich mir vor Kurzem wieder gestellt, da ich ein TableView ähnliches CustomView schreibe.
Hier mein Ansatz:
NSTableView kennt den NSArrayController, der die Daten bereitstellt. Dies wird mittels des Content-Bindings von NSTableView sichergestellt.
Apple Doku über das content-Binding von NSTableView:
“An NSArrayController instance that provides the content of the NSTableView.
Typically, the content binding is created automatically when the initial NSTableColumn binding is made, binding to the column's NSArrayController.”
Wunderbar. Somit kennt NSTableView durch [[self content] arrangedObjects] auch die schon sortierten Daten, die es bereitstellen muss.
Ein NSTableView hat meist mehrere Spalten. Was nun in welche Spalte soll wird der entsprechenden Spalte über deren value-Binding mitgeteilt. Mit dem keyPath des value Bindings wird einfach der ArrayController der Table befragt.
Soweit richtig?
Dann gehts weiter:
An einer Stelle im Code rufe ich die add: Methode des ArrayControllers auf. Wie durch Zauberhand erscheint in der TableView ein neuer Eintrag. Wie das? Die TableView wird kaum alle paar Sekundenbruchteile sich selbst komplett neu laden...
Wie sieht es mit Änderungen aus, die ich vom Code aus an einen Objekt welches im ArrayController ist vornehme. Diese Änderung wird vom TableView auch sofort angezeigt. Tom hat in Wiki erklärt, dass und wie man ein Array observieren kann. Observiert die Table also tatsächlich [[self content] arrangedObjects] auf Änderungen und reagiert darauf einfach mit einem [self setNeedsDisplay:YES]?
Weiter zu den SelectionIndexes:
Klicke ich wie wild in der TableView rum ermittelt die TableView wohl anhand meiner Rumklickerei ihre neuen SelectionIndexes und übergibt diese an ihren ArrayConroller. Oder?
									
									
								die “Bindingstechnologie” ist für viele (für mich eingeschlossen) noch ein etwas magisch wirkendes Gebilde. Leute wie Tom sorgen mit all ihrer Kraft für Aufklärung auf diesem Gebiet - erklären immer wieder, dass Bindings eigentlich nur KVC/KVO in Komibination sind. Dennoch bleibt - zumindest bei mir - immer ein Rest, der ungeklärt bleibt. Es wäre wohl ganz sinnvoll Bindings mal ein einem komplexen aber konkreten Beispiel wie NSTableView zu erklären.
Die Frage ist: Wie kommen die Daten (via Bindings) in die TableView, wie werden die Änderungen “bekannt” gegeben, wie die SelectionIndexes gemanaged usw. Diese Fragen habe ich mir vor Kurzem wieder gestellt, da ich ein TableView ähnliches CustomView schreibe.
Hier mein Ansatz:
NSTableView kennt den NSArrayController, der die Daten bereitstellt. Dies wird mittels des Content-Bindings von NSTableView sichergestellt.
Apple Doku über das content-Binding von NSTableView:
“An NSArrayController instance that provides the content of the NSTableView.
Typically, the content binding is created automatically when the initial NSTableColumn binding is made, binding to the column's NSArrayController.”
Wunderbar. Somit kennt NSTableView durch [[self content] arrangedObjects] auch die schon sortierten Daten, die es bereitstellen muss.
Ein NSTableView hat meist mehrere Spalten. Was nun in welche Spalte soll wird der entsprechenden Spalte über deren value-Binding mitgeteilt. Mit dem keyPath des value Bindings wird einfach der ArrayController der Table befragt.
Soweit richtig?
Dann gehts weiter:
An einer Stelle im Code rufe ich die add: Methode des ArrayControllers auf. Wie durch Zauberhand erscheint in der TableView ein neuer Eintrag. Wie das? Die TableView wird kaum alle paar Sekundenbruchteile sich selbst komplett neu laden...
Wie sieht es mit Änderungen aus, die ich vom Code aus an einen Objekt welches im ArrayController ist vornehme. Diese Änderung wird vom TableView auch sofort angezeigt. Tom hat in Wiki erklärt, dass und wie man ein Array observieren kann. Observiert die Table also tatsächlich [[self content] arrangedObjects] auf Änderungen und reagiert darauf einfach mit einem [self setNeedsDisplay:YES]?
Weiter zu den SelectionIndexes:
Klicke ich wie wild in der TableView rum ermittelt die TableView wohl anhand meiner Rumklickerei ihre neuen SelectionIndexes und übergibt diese an ihren ArrayConroller. Oder?
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].
									Objective-C und Cocoa Band 2: Fortgeschrittene
Cocoa/Objective-C Seminare von [co coa:ding].
