2012-05-01 8 views
5

In meinem Projekt ziehe ich Daten von einer .plist, konkreter von einem NSDictionary. Ich initiiere ein Wörterbuch mit dem Inhalt der .plist, was gut funktioniert. Als ich dannNSDictionary AllKeys-Array durcheinander - nicht in der Reihenfolge, in der sie im Wörterbuch sind?

tue
NSArray *array = [dict allKeys]; 

es füllt das Array mit allen Schlüsseln, aber in einer völlig zufälligen Reihenfolge, anders als die Reihenfolge, wie sie sind in der .plist-Datei. Ich würde wirklich die Reihenfolge beibehalten müssen. Die Schlüssel im Wörterbuch sind Arrays, wenn das ein Problem verursachen könnte. Was bekomme ich nicht?

Vielen Dank im Voraus!

Antwort

7

Ähnlich wie es keine Reihenfolge zwischen Elementen in einem NSSet gibt, gibt es keine inhärente Reihenfolge der Schlüssel/Wert-Paare in einem NSDictionary.

Wenn Sie Schlüssel unter einer bestimmten Reihenfolge möchten, müssten Sie etwas wie - (NSArray *)keysSortedByValueUsingComparator:(NSComparator)cmptr verwenden, aber das wird nicht die Reihenfolge geben, in der das NSDictionary in der PLIST-Datei serialisiert wurde.

+0

so die Antwort ist, ist es nicht möglich, zu tun, was ich will? –

+0

Natürlich ist es möglich, es ist einfach nicht so einfach wie du gehofft hast. Sehen Sie meine Antwort für einen Weg, um das zu erreichen, was Sie zu erreichen versuchen. –

+2

Wenn Sie möchten _ "In welcher Reihenfolge werden Schlüsselwerte in der PLIST-Datei gespeichert?" _ Dann lautet die kurze Antwort "NEIN". Lange Antwort: Es sei denn, Sie möchten die plist-Datei manuell analysieren. NS-Wörterbücher enthalten _unordered_ Schlüssel-Wert-Paare. NSArrays enthalten _ordered_ items. Wenn Sie die Daten speichern und zurücklesen, müssen Sie möglicherweise NSArray verwenden, um Ihre Daten zu speichern. –

3

Wie Qwerty Bob sagte, bestellt NSDictionary seinen Inhalt nicht. Wenn Sie eine Reihenfolge für die Schlüssel beibehalten müssen, besteht die Möglichkeit, ein Array der Schlüssel in Ihrer .plist-Datei separat zu speichern. Zählen Sie dann das Array auf und verwenden Sie es, um auf die Wörterbuchwerte in der richtigen Reihenfolge zuzugreifen.

2

Sie können ein NSArray mit den Dictionary-Schlüsseln in der gewünschten Reihenfolge erstellen.

+0

Können Sie bitte ein Beispiel geben? – Dejell

6

Es gibt keine solche eingebaute Methode, von der Sie dies erwerben können. Aber eine einfache Logik funktioniert für dich. Sie können vor jeder Taste einfach einen numerischen Text einfügen, während Sie das Wörterbuch vorbereiten. Wie

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

Nun, wenn Sie können sortingArrayUsingSelector verwenden, während alle Schlüssel in der gleichen Reihenfolge bekommen, wie Sie platzieren.

An der Stelle, wo Sie Tasten in UIView anzeigen möchten, hacken Sie einfach die vorderen 3 Zeichen.

+0

Danke Schwarzer Tiger :) –

-1

Versuchen Sie folgendes:

NSArray *array = [dict allKeys]; 

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

NSArray *orderedKeys = [array sortedArrayUsingDescriptors:descriptors]; 
Verwandte Themen