2013-07-19 18 views
9

Muszę wyświetlić w UITableView zawartość NSDictionary zwrócony przez API, z poszanowaniem kolejności kluczy.NSDictionary allKeys order

Używam:

- (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; 
} 

ale jak ja self.data.allKeys, jestem tracąc kolejność moich kluczy. Nie mogę ich sortować według wartości, ponieważ ich nie dotyczy.

+1

Te klucze nigdy tam, gdzie zostały zamówione. Słowniki nie mają zamówienia. –

+0

możliwy duplikat [Jak mogę uzyskać oryginalną kolejność NSDictionary/NSMutableDictionary?] (Http://stackoverflow.com/questions/3386921/how-can-i-get-original-order-of-nsdictionary-nsmutabledictionary) – Amar

Odpowiedz

1

Jak każdy powiedział nie mogę zamówić moje klucze, które pojawiają się w moim dzienniku NSDictionary ponieważ NSDictionary nie jest zamówione.

Poprosiłem ludzi z API do powrotu tablicę zamiast:

0 => name : key 1 
    value : value 1 

1 => name : key 2 
    value : value 2 

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

Szkoda, że ​​nie jest to metoda „sortedArrayUsingArray” użyty tak:

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

Nie ma takiej metody: "sortedArrayUsingArray". Użyj: http://blog.pioneeringsoftware.co.uk/2008/20/sorting-an-array-by-another-array/ –

23

Spróbuj tego,

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

NSLog(@"%@",keys); 

teraz sprowadzić wartości na podstawie klucza posortowane.

EDIT

Aby posortować je w kolejności alfabetycznej spróbować tego,

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

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

Ale Nie mam czegoś takiego jak "Foo1", "Foo2" ... Nie mam żadnych numerów w moim kluczowym imieniu. Mój API zwraca key = "Cinema" value = lista kina, key = "Theater", value = lista teatru, i muszę wyświetlić je w tej kolejności: najpierw kina, potem kina. –

+0

@NicolasRoy Proszę sprawdzić zaktualizowaną odpowiedź. –

+0

@ грогава Nie chcę sortować tych kluczy tam, gdzie chcę, żeby klucze zostały odebrane bez zmiany kolejności. Czy to możliwe? proszę pomóż. –

0

napisałem szybki sposób do podjęcia tablicy źródłowej (obiektu s wszystkie są nieczynne) i tablica referencyjna (która ma obiekty w pożądanej (i całkowicie arbitralnej) kolejności) i zwraca tablicę, w której elementy tablicy źródłowej zostały zreorganizowane tak, aby pasowały do ​​tablicy referencyjnej.

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

Należy zauważyć, że jest to bardzo delikatne. Używa on metody NSArray 's, która ostatecznie wywoła NSObject's isEqual:. Zasadniczo, powinien on działać doskonale dla tablic z NSString s, NSNumber s, i może NSDate s (jeszcze nie próbowałem tego), ale poza tym, YMMV. Wyobrażam sobie, że jeśli próbowałbyś przekazać tablice z UITableViewCell s lub innym naprawdę skomplikowanym obiektem, to byłoby to całkowicie sh * t, i albo się zawiesił, albo zwrócił całkowite śmieci. Podobnie, gdybyś zrobił coś takiego, jak przekazanie tablicy NSDate s jako tablicy referencyjnej i tablicy NSString s jako tablicy źródłowej. Ponadto, jeśli tablica źródłowa zawiera elementy nieobjęte tablicą referencyjną, zostaną one po prostu odrzucone. Można rozwiązać niektóre z tych problemów, dodając trochę dodatkowego kodu.

Wszystko, co powiedzieliśmy, jeśli próbujesz zrobić coś prostego, powinno to działać ładnie. W twoim przypadku wystarczy wysłać arrayOne z odpowiedzi wysłanej jako tablica źródłowa, a arrayTwo jako tablicę referencyjną.

0

Powiedziałeś, że tracisz kolejność kluczy, więc przypuszczam, że wyciągasz te klucze z NSArray. Dobrze? I w tym NSArray masz klucze zamówione, jak chcesz. I widzę również, że obiekty NSDictionaryArrays, prawda? Tak.Tak więc w twoim Ordered Array masz więcej tablic.

data to nazwa NSDictionary.

Wszystko, co musisz zrobić, to przynieść NSArray (ten, który jest zamówiony, jak zawsze chciałeś) do tego pliku .m, a następnie użyć niesamowitego kodu w swojej metodzie cellForRowAtIndexPath. Można to zrobić w następujący sposób:

@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; 
} 

I to jest wszystko, co musisz zrobić, aby utrzymać porządek chcesz przy użyciu NSDictionary i NSArray.

Aby uzmysłowić to lepiej, w przypadku, że zamówił tablica zawiera tylko ciągi to będzie jak ten:

- (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; 
} 

Nadzieję, że to pomaga.