NSTableview bindings y ordena alfabeticament

Hola tinc un problema, un NSTableview que li paso les dades amb bindings, hi han 4 columnes una amb el nom del producte que amb inteface builder te el binding amb el key "nom" i les altres columnes son preus amb els "key: Eroski,Binipreu,Dia".

Llegeixo les dades de un plist que conte uns diccionaris amb nom del producte y els preus cada item del plist es un diccionari que conte un string i tres numbers i els paso ha un array per controlarlos amb un arraycontroler del interface builder, tot funciona be, cuan surten en el NSTableview tenen el ordre le lectura o sigui sense esta ordenats alfabeticament i si selecciono un row per agafar el seu valor resulta que no coincideix amb el index del array que tinc i em surt un altra valor i si li faix clic a el header de la columna per ordenarlos tampoc em surten els valors que tindrien que ser.

¿Com es pot fer per que estiguin ordenats alfabeticament i que al agafar els valors fen clic al row del NSTableview surtin be?
Gracies.

Lluis  sep  04 setembre 2009 01:50

Pre-suposo que utilitzes un NSArrayController a la interfície, i que el PLIST és un array de diccionaris.

Si treballes amb un NSArrayController, pots treballar simplement amb la interfície gràfica o actuar amb programació: amb l'NSArrayController o amb l'NSTableView.

Si només treballes amb la interfície gràfica, és a dir que només vols mostrar l'element seleccionat, simplement crea les entrades on vols mostrar-les i fes-hi un binding entre l'arraycontroller amb l'element "selection" i el nom de la variable.

Si has de fer programació i no et cal molt control de l'NSTableView, és millor que treballis amb el controlador. A la classe et crees una variable i en fas un binding amb els elements seleccionats "selection indexes" de l'NSArrayController. Quan aquest canviï, s'executarà el mètode per modificar la variable del "NSIndexSet" i pots sobre-escriure aquest mètode per tractar-lo com millor et vagi i fer-hi el que vulguis.

Si et cal molt de control i ho fas amb l'NSTableView has de tenir en compte que si implementes la funció que et detecta quan selecciones una fila no pots utilitzar els mètodes dels elements seleccionats de l'NSArrayController (selectionIndex, selectionIndexes, selectedObjects) ja que encara no estan actualitzats. Cal que obtinguis el número de fila de la taula seleccionada i l'array mostrat al NSTableView amb el mètode "arrangedObjects", llavors pots veure quin és l'objecte de la fila que et retorna el tableview, ja que l'array original es manté igual i l'arraycontroller pot ordenar-se, filtrar-se, …

Per ordenar simplement has de tenir l'objecte que es mostra a la columna de la taula de tipus ordenable (text, número, ...) que implementi el mètode "compare:". I al binding del valor de la columna activar l'opció "Create Sort Descriptor" per defecte s'activa.

Si el valor de la columna no és ordenable o ho és amb un altre mètode o ho vols ordenar per un altre valor, pots seleccionar els atributs de la columna i indicar els atributs següents:
- Sort Key: la variable per ordenar des dels objectes de l'array (no del valor de la columna), separats pels punts fins arribar a la variable que vols utilitzar.
- Selector: el mètode que ordena els objectes, que ha de tenir un paràmetre i retornar un NSComparisonResult, en un string en tens diferents: "caseInsensitiveCompare:, localizedCompare:, localizedCaseInsensitiveCompare:". Te'n pots crear tu mateix els teus.
- order: L'ordre per defecte, ascendent o descendent.

Si vols utilitzar un mètode d'ordenació amb més d'un paràmetre ho hauràs d'implementar en el codi. Hauràs de fer un IBOutlet amb la columna de la taula i establir aquest mètode per ordenar. Mira't el mètode "setSortDescriptorPrototype:" de la class NSTableColumn.

Bé, t'ho he presentat una mica per sobre. Decideixis el que decideixis, digues-ho i ho podem anar seguint.

Xin  sep  04 setembre 2009 09:07

Selecciona'l abans d'enviar el commentari