2013-07-19 10 views
9

Ich muss in einem UITableView den Inhalt eines NSDictionary angezeigt, das von einer API zurückgegeben wird, unter Berücksichtigung der Reihenfolge der Schlüssel.NSDictionary allKeys Auftrag

Ich verwende:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
     NSString *key = self.data.allKeys[indexPath.section]; 
     NSArray *list = self.data[key]; 
     id data = list[indexPath.row]; 

     PSSearchCell *cell = [PSSearchCell newCellOrReuse:tableView]; 

     cell.model = data; 

     return cell; 
} 

aber wie ich self.data.allKeys tun, ich die Reihenfolge meiner Schlüssel zu verlieren. Ich kann sie nicht nach Wert sortieren, da es sie nicht betrifft.

+1

Diese Schlüssel wurden nie bestellt. Wörterbücher haben keine Reihenfolge. –

+0

mögliche Duplikate von [Wie bekomme ich Original Bestellung von NSDictionary/NSMutableDictionary?] (Http://stackoverflow.com/questions/3386921/how-can-i-get-original-order-of-nsdictionary-nsmutabledictionary) – Amar

Antwort

1

Wie jeder sagte, ich nicht meine Schlüssel bestellen können, wie sie, weil ein NSDictionary in meinem NSDictionary log erscheinen ist nicht bestellt.

Ich bat die Leute von der API ein Array statt zurückzukehren:

0 => name : key 1 
    value : value 1 

1 => name : key 2 
    value : value 2 

/------------------------- -------------------------------------------------- -/

Schade, dass es keine Methode „sortedArrayUsingArray“ so verwendet wird:

NSArray * arrayOne = [@"key E", @"key A", @"key C"]; 

NSArray * arrayTwo = [@"key A", @"key B", @"key C", @"key D", @"key E", @"key F"]; 

NSArray * orderedArray = [arrayOne sortedArrayUsingArray: arrayTwo]; 
+0

Keine solche Methode existiert: "sortedArrayUsingArray". Verwenden Sie: http://blog.pioneeringsoftware.co.uk/2008/08/20/sorting-an-array-by-another-array/ –

23

die Sie interessieren,

NSArray *keys = [myDictionary allKeys]; 
keys = [keys sortedArrayUsingComparator:^(id a, id b) { 
    return [a compare:b options:NSNumericSearch]; 
}]; 

NSLog(@"%@",keys); 

Jetzt Werte basierend auf der sortierten Schlüssel holen.

EDIT

Um sie in alphabetischer Reihenfolge versuchen dies, zu sortieren

NSArray *keys = [myDictionary allKeys]; 
keys = [[keys mutableCopy] sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

NSLog(@"%@",keys); 
+0

Aber Ich habe nicht so etwas wie "Foo1", "Foo2" ... Ich habe keine Nummern in meinem Schlüsselnamen. Meine API gibt key = "Cinema" -Wert zurück = Liste von Kino, key = "Theater", value = Liste von Theater, und ich muss sie in dieser Reihenfolge anzeigen: Kinos zuerst, dann Theater. –

+0

@NicolasRoy Bitte überprüfen Sie die aktualisierte Antwort. –

+0

@ βhargavḯ Ich möchte diese Schlüssel nicht sortieren, wo die Schlüssel empfangen werden sollen, ohne die Reihenfolge zu ändern. So ist es möglich? bitte hilfe. –

0

ich eine schnelle Methode hat ein Quell-Array zu nehmen (von Objekt s, die alle nicht in Ordnung sind) und ein Referenzarray (das Objekte in einer gewünschten (und völlig willkürlichen) Reihenfolge hat) und ein Array zurückgibt, in dem die Elemente des Quellarrays so reorganisiert wurden, dass sie mit dem Referenzarray übereinstimmen.

- (NSArray *) reorderArray:(NSArray *)sourceArray toArray:(NSArray *)referenceArray 
{ 
    NSMutableArray *returnArray = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < [referenceArray count]; i++) 
    { 
     if ([sourceArray containsObject:[referenceArray objectAtIndex:i]]) 
     { 
      [returnArray addObject:[arrReference objectAtIndex:i]]; 
     } 
    } 
    return [returnArray copy]; 
} 

Beachten Sie, dass dies sehr zerbrechlich ist. Es verwendet die containsObject: Methode, die schließlich NSObject's isEqual: aufrufen wird. Grundsätzlich sollte es gut für Arrays von NSString s, NSNumber s und vielleicht NSDate s funktionieren (habe das noch nicht probiert), aber darüber hinaus, YMMV. Ich stelle mir vor, wenn Sie versuchen, Arrays von UITableViewCell s oder ein anderes wirklich komplexes Objekt zu übergeben, würde es sich selbst total abstürzen und entweder Total Crash oder Total-Müll zurückgeben. Wenn Sie etwas tun möchten, übergeben Sie beispielsweise ein Array von NSDate s als Referenz-Array und ein Array von NSString als Quell-Array. Wenn das Quell-Array Elemente enthält, die nicht im Referenz-Array enthalten sind, werden sie einfach verworfen. Man könnte einige dieser Probleme lösen, indem man ein wenig zusätzlichen Code hinzufügt.

All das gesagt, wenn Sie versuchen, etwas Einfaches zu tun, sollte es gut funktionieren. In Ihrem Fall senden Sie einfach arrayOne aus der Antwort, die Sie als Quell-Array angegeben haben, und arrayTwo als Referenz-Array.

0

Sie sagten, dass Sie die Reihenfolge der Schlüssel verloren haben, also nehme ich an, dass Sie diese Schlüssel von einem NSArray ziehen. Recht? Und in diesem NSArray haben Sie die Schlüssel, wie Sie möchten. Und ich sehe auch, dass die Objekte der NSDictionaryArrays sind, richtig? Ja.Also in Ihrem Ordered Array haben Sie mehr Arrays.

data ist der Name des NSDictionary.

Also, alles, was Sie tun müssen, ist, dass NSArray (die, die bestellt wird, wie Sie schon immer wollten) in diese .m-Datei und danach einige erstaunliche Code in Ihrer cellForRowAtIndexPath Methode. Sie können es tun, indem Sie folgendermaßen vorgehen:

@interface yourViewController() 
{ 
    NSArray *yourArrayOrdered; 
} 
@end 

@implementation yourViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    yourArrayOrdered = [[NSArray alloc] initWith...:... ]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath 
{ 
    NSString *key = yourArrayOrdered[indexPath.row]; 
    NSArray *list = [self.data objectForKey:yourArrayOrdered[indexPath.row]]; 

    //your code continues here... 

    /*id data = list[indexPath.row]; //don't think you need this line 

    PSSearchCell *cell = [PSSearchCell newCellOrReuse:tableView]; 

    cell.model = data; */ 

    return cell; 
} 

Und das ist alles, was Sie tun müssen, um die Bestellung erhalten Sie ein NSDictionary und NSArray behalten möchten verwenden.

Um es besser sichtbar zu machen, in dem Fall, dass Ihr geordnetes Array nur Strings enthält es so sein würde:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath 
{ 
    NSString *key = yourArrayOrdered[indexPath.row]; 

    NSString *myString = [self.data objectForKey:yourArrayOrdered[indexPath.row]]; 

    cell.textLabel.text = [NSString stringWithFormat:@"THIS IS THE OBJECT %@", myString]; 

    cell.detailTextLabel.text = [NSString stringWithFormat:@"AND THIS IS THE KEY %@", key]; 

    return cell; 
} 

Hoffe, es hilft.