2012-05-01 11 views
5

w moim projekcie Pobieram dane z .plist, konkretniej z NSDictionary. Zainicjuję słownik z zawartością pliku .plist, który działa dobrze. Kiedy następnie zrobićTablica alldsysów NSDictionary'a zawiedli - nie w kolejności, w jakiej są w słowniku?

NSArray *array = [dict allKeys]; 

wypełnia tablicę ze wszystkimi kluczami, ale w zupełnie przypadkowej kolejności, różni się od kolejności, w jakiej znajdują się w pliku .plist. Naprawdę potrzebowałbym zachować zamówienie. Klucze w słowniku to tablice, które mogą powodować problemy. Czego nie otrzymuję?

Bardzo dziękuję z góry!

Odpowiedz

7

Podobnie jak nie ma żadnego porządku między przedmiotami w NSSet, nie ma naturalnej kolejności par klucz-wartość w NSDictionary.

Jeśli chcesz mieć klucze pod określoną kolejnością, musisz użyć czegoś takiego jak - (NSArray *)keysSortedByValueUsingComparator:(NSComparator)cmptr, ale to nie da kolejności, w której NSDictionary był serializowany w pliku plist.

+0

więc odpowiedź brzmi, że nie jest możliwe, aby robić to, co chcę? –

+0

Oczywiście, że jest to możliwe, nie jest to tak łatwe, jak masz nadzieję. Zobacz moją odpowiedź na jeden sposób, aby osiągnąć to, co wydaje się próbować osiągnąć. –

+2

Jeśli chcesz _ "Jaka jest kolejność zapisywania par klucz-wartość w pliku plist?" _, Wtedy krótką odpowiedzią jest "nie". Długa odpowiedź: Nie, chyba że chcesz, aby ręczne parsowanie pliku plist było obciążone. NSDictionaries posiadają pary _unordered_ parami klucz-wartość. NSArrays posiadają elementy _ordered_. Jeśli przechowujesz i czytasz dane, być może musisz użyć NSArray do przechowywania danych. –

3

Jak powiedział Bob Qwerty, NSDictionary nie zamawia jego zawartości. Jeśli chcesz zachować zamówienie na klucze, jednym ze sposobów na to byłoby osobne przechowywanie tablicy kluczy w pliku .plist. Następnie wyliczyć tablicę i użyć jej, aby uzyskać dostęp do wartości słownika w kolejności.

2

Możesz utworzyć NSArray z klawiszami Dictionary w żądanej kolejności.

+0

Czy możesz podać przykład? – Dejell

6

Nie ma takiej wbudowanej metody, z której można to uzyskać. Ale prosta logika dla ciebie. Możesz po prostu dodać kilka tekstów numerycznych przed każdym klawiszem podczas przygotowywania słownika. Jak

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

teraz, jeśli można użyć sortingArrayUsingSelector podczas uzyskiwania wszystkie klucze w tej samej kolejności, jak miejsce.

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

W miejscu, w którym chcesz wyświetlić klucze w UIView, po prostu odetnij przednią 3 znak.

+0

Dzięki Czarny Tygrys :) –

-1

Spróbuj tego:

NSArray *array = [dict allKeys]; 

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

NSArray *orderedKeys = [array sortedArrayUsingDescriptors:descriptors]; 
Powiązane problemy