2012-05-01 4 views
5

nel mio progetto sto tracciando i dati da un .plist, più concretamente da un NSDictionary. Inizio un dizionario con i contenuti di .plist, che funziona bene. Quando poi fareL'array allKeys di NSDictionary è incasinato - non nell'ordine in cui si trovano nel dizionario?

NSArray *array = [dict allKeys]; 

che riempie l'array con tutte le chiavi, ma in un ordine del tutto casuale, diverso l'ordine in cui sono nel file .plist. Avrei davvero bisogno di mantenere l'ordine. Le chiavi nel dizionario sono array, se ciò potrebbe causare un problema. Cosa non ottengo?

Grazie mille in anticipo!

risposta

7

Proprio come non esiste un ordine tra gli elementi in un NSSet, non esiste un ordine intrinseco alle coppie chiave-valore all'interno di un NSDictionary.

Se si desidera utilizzare chiavi con un ordine specifico, è necessario utilizzare qualcosa come - (NSArray *)keysSortedByValueUsingComparator:(NSComparator)cmptr ma questo non darà l'ordine in cui il NSDictionary è stato serializzato nel file Plist.

+0

quindi la risposta è, non è possibile fare ciò che voglio? –

+0

Certo che è possibile, non è così facile come speri. Vedi la mia risposta per un modo per realizzare ciò che sembri cercare di ottenere. –

+2

Se si desidera _ "Qual è l'ordine in cui i valori-chiave sono memorizzati nel file Plist?" _, La risposta breve è "no". Risposta lunga: a meno che non si desideri il peso dell'analisi manuale del file Plist. NSDictionaries tiene coppie di valori-chiave _unordered_. Gli NSArrays tengono gli oggetti _ordered_. Se si sta memorizzando e leggendo i dati, forse è necessario utilizzare NSArray per memorizzare i dati. –

3

Come ha detto Qwerty Bob, NSDictionary non ne ordina il contenuto. Se è necessario mantenere un ordine per le chiavi, un modo per farlo sarebbe archiviare separatamente un array di chiavi nel file .plist. Quindi, enumerare la matrice e utilizzarla per accedere ai valori del dizionario in ordine.

2

È possibile creare un NSArray con i tasti del dizionario nell'ordine desiderato.

+0

Puoi per favore fare un esempio? – Dejell

6

Non esiste un tale metodo integrato da cui è possibile acquisire questo. Ma una logica semplice funziona per te. Puoi semplicemente aggiungere un po 'di testo numerico davanti a ciascun tasto mentre prepari il dizionario. Come

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys: 
         @"01.Created",@"cre", 
         @"02.Being Assigned",@"bea", 
         @"03.Rejected",@"rej", 
         @"04.Assigned",@"ass", 
         @"05.Scheduled",@"sch", 
         @"06.En Route",@"inr", 
         @"07.On Job Site",@"ojs", 
         @"08.In Progress",@"inp", 
         @"09.On Hold",@"onh", 
         @"10.Completed",@"com", 
         @"11.Closed",@"clo", 
         @"12.Cancelled", @"can", 
         nil]; 

Ora, se è possibile utilizzare sortingArrayUsingSelector mentre ottenere tutti i tasti nello stesso ordine in cui si inserisce.

NSArray *arr = [[dict allKeys] sortedArrayUsingSelector:@selector(localizedStandardCompare:)]; 

Nel luogo in cui si desidera visualizzare le chiavi in ​​UIView, appena recidere il 3 carattere anteriore.

+0

Grazie Black Tiger :) –

-1

Prova questo:

NSArray *array = [dict allKeys]; 

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO]; 
NSArray *descriptors = [NSArray arrayWithObject:descriptor]; 

NSArray *orderedKeys = [array sortedArrayUsingDescriptors:descriptors];