2010-03-07 17 views
9

Ho un problema con l'ordinamento dei contenuti NSTableColumn. Nel mio NSTableView ci sono tre colonne: File, Dimensione, Percorso. I contenuti sono memorizzati in NSMutableArray. Ogni oggetto in questo array è un NSDictionary che contiene tre chiavi: file, dimensione e percorso - il valore per ciascuna è una NSString.Ordinamento contenuto NSTableColumn

In Interface Builder, negli attributi di ogni tabella della colonna posso scegliere le opzioni di ordinamento: Selector: IB entrato "confronto:" che credo è ok, perché io paragono NSStrings. Chiave di ordinamento - e questo è il problema che penso - non so cosa inserire qui.

Eventuali indizi? Se hai domande sul mio codice, per favore chiedi.

risposta

11

Quindi ho trovato la soluzione completa.

In primo luogo, andare a Interface Builder. Seleziona la colonna che vuoi ordinare. Vai alla finestra di ispezione della colonna e scegli il primo pulsante per vedere gli "Attributi della colonna di tabella". valori appropriati impostati (letteralmente, no "o 'o @ sono necessari):

Sort key: file 

dove ' file' è la chiave di dizionario che il contenuto viene visualizzato nella colonna

Selector: compare: 

funzione di ordinamento di serie .

Ora, salvare tutte le modifiche qui e saltare a Xcode, alla classe in cui è il modello, fonte dei dati riportati nella NSTableView dovreste già sapere che avete bisogno di due metodi là:.

-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView 
-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn 
*)tableColumn row:(NSInteger)row 

questi due sono necessari per conformare il protocollo informale NSTableDataSource. Puoi leggerlo al MacDev Center.

Ora tutto ciò che dovete fare è aggiungere un nuovo metodo:

-(void)tableView:(NSTableView *)tableView sortDescriptorsDidChange: (NSArray *)oldDescriptors 

Può contenere un codice molto semplice che farà la cosa:

-(void)tableView:(NSTableView *)tableView sortDescriptorsDidChange: (NSArray *)oldDescriptors 
{  
    NSArray *newDescriptors = [tableView sortDescriptors]; 
    [results sortUsingDescriptors:newDescriptors]; 
    //"results" is my NSMutableArray which is set to be the data source for the NSTableView object. 
    [tableView reloadData]; 
} 

E questo è tutto. Funziona nella mia app, spero che funzioni nel tuo caso: D Tutto dovrebbe funzionare automaticamente. Ho appena salvato tutti i file e costruito l'app. E ha funzionato.:)

sito che mi ha aiutato: CocoaDev: SortingNSTableView

+0

Hai salvato la mia giornata! – 11684

+0

Prego! –

+0

Awsumly mi ha salvato dal diventare matto ... :) –

2

Key è lo key che si utilizza nel dizionario per recuperare il valore.

Nel tuo caso hai tre chiavi: file, dimensioni e percorso. Selezionare quello su cui si desidera ordinare. La chiave viene utilizzata per recuperare il valore da ciascun record da utilizzare per l'ordinamento.

Se le chiavi sono @ "file", @ "dimensione", @ "percorso" e si desidera ordinare su file, provare a inserire value.file nel campo Sort Key in IB.

Utilizzare i tasti che si utilizzano quando si inserisce values nel NSDictionary.

+0

Grazie per la risposta ma non mi sare la risposta. Vedo questa finestra: http://homepage.mac.com/simx/.Pictures/column_attributes.png Ho la sensazione che sia più facile che aggiungere un pezzo di codice nella mia app. Cosa pensi che dovrei inserire nel campo 'Ordina chiave'? –

+0

** Modificato **: rimosso l'esempio di codice 'confusing', era per mostrare come è fatto nel codice in modo da vedere la connessione tra i valori IB e il codice. Ma visto che complica le cose l'ho rimosso. Quindi ora dovrebbe essere chiaro che cosa dovresti inserire in IB. – stefanB

+0

Non funziona. Ho provato anche questi: - valueForKey: @ "path" - objectForKey: @ "file" - value.objectForKey: @ "file" Nessuno sta funzionando .. Non so cosa fare. Forse dovrei creare dei legami o qualcosa del genere? Da chi è la prospettiva dovrei scrivere questa chiave? –