2012-05-01 7 views
5

en mi proyecto Estoy extrayendo datos de una .plist, más concretamente de un NSDictionary. Inicié un diccionario con los contenidos de .plist, que funciona bien. Cuando luego hacerArreglo allKeys de NSDictionary en mal estado, ¿no en el orden en que están en el diccionario?

NSArray *array = [dict allKeys]; 

que se llena la matriz con todas las llaves, pero en un orden totalmente aleatorio, diferente al orden en que se encuentran en el archivo plist. Realmente necesitaría preservar el orden. Las claves en el diccionario son matrices, si eso pudiera causar un problema. ¿Qué no estoy recibiendo?

¡Muchas gracias de antemano!

Respuesta

7

Al igual que no hay ningún orden entre los elementos en un NSSet, no hay un orden inherente a los pares clave-valor dentro de un NSDictionary.

Si desea claves bajo un orden específico, necesitará usar algo como - (NSArray *)keysSortedByValueUsingComparator:(NSComparator)cmptr, pero eso no dará el orden en que NSDictionary fue serializado en el archivo plist.

+0

así que la respuesta es, no es posible hacer lo que yo quiero? –

+0

Por supuesto que es posible, simplemente no es tan fácil como esperas. Vea mi respuesta de una manera para lograr lo que parece que está tratando de lograr. –

+2

Si desea _ "¿Cuál es el orden en que se almacenan los pares clave-valor en el archivo plist?" _ Entonces la respuesta abreviada es "no". Respuesta larga: no, a menos que desee la carga de analizar manualmente el archivo plist. Los NSDictionaries tienen pares de claves-valores sin ordenar. NSArrays contiene artículos ordenados. Si usted es el que almacena y lee los datos, tal vez necesite usar NSArray para almacenar sus datos. –

3

Como dijo Qwerty Bob, NSDictionary no ordena sus contenidos. Si necesita conservar un pedido de claves, una forma de hacerlo sería almacenar por separado un conjunto de claves en su archivo .plist. Luego, enumere la matriz y utilícela para acceder a los valores del diccionario en orden.

2

Puede crear un NSArray con las teclas del Diccionario en el orden que desee.

+0

¿Podría dar un ejemplo? – Dejell

6

No existe ningún método incorporado del que pueda adquirirlo. Pero una simple lógica funciona para ti. Simplemente puede agregar algunos textos numéricos al frente de cada tecla mientras prepara el diccionario. Al igual que

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]; 

Ahora si se puede usar sortingArrayUsingSelector al obtener todas las claves en el mismo orden en que se coloca.

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

En el lugar donde desea visualizar las teclas en UIView, simplemente corte los 3 caracteres frontales.

+0

Gracias Black Tiger :) –

-1

Prueba esto:

NSArray *array = [dict allKeys]; 

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

NSArray *orderedKeys = [array sortedArrayUsingDescriptors:descriptors]; 
Cuestiones relacionadas