2014-05-14 20 views
9

Ist es möglich, einen Wörterbuchschlüssel per Index zu erhalten?NSDictionary-Schlüssel per Index abrufen?

Ich versuche, ein Wörterbuch für die Datenquelle von einer Picker-Ansicht zu verwenden und es in folgenden Delegatmethode zugreifen möchte:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ 
if (component == 0){ 
    return [NSString stringWithFormat:@"%@",[myDict // how to get the key]]; 
} 

EDIT--

myDict ist so etwas wie:

Artikel 1

  • Unterpunkt 1
  • Unterpunkt 2

Artikel 2

  • Unterpunkt 1
  • Unterpunkt 2

I myDict als Datenquelle für einen Picker Ansicht verwenden möchten, die zwei Abschnitte aufweist:

Abschnitt 0 = myDict Schlüssel (Artikel 1, Artikel 2)

Sektion 1 = entsprechende myDict-Werte für ausgewählte Sektion 0 Zeile (Unterpunkt 1, Unterpunkt 2)

+3

Was meinst du mit Wörterbuchschlüssel durch den Index zu bekommen? Wie wäre es, es mit Beispiel oder mehr Code auszuarbeiten? – Ricky

+3

Wörterbücher haben keinen Index, Sie können die allKeys-Methode verwenden, um ein Array der Schlüssel zu erhalten. – rdelmar

+0

Lesen Sie die NSDictionary-Spezifikation und sehen Sie, welche Funktionen verfügbar sind. –

Antwort

21

Seit NSDictionary sind ein ungeordneten assoziativen Container, es hat kein Konzept für die Indizierung. Seine Schlüssel sind willkürlich angeordnet, und diese Reihenfolge kann sich in der Zukunft ändern.

Sie können ein NSArray des Schlüssels aus dem Wörterbuch bekommen und anwenden Indizierung es:

NSArray *keys = [myDict allKeys]; // Warning: this order may change. 

jedoch diese Indexierschema würde nur so lange konsistent bleiben, wie das Wörterbuch unverändert bleibt: zum Beispiel, wenn Sie Verwenden Sie NSMutableDictionary, Hinzufügen eines zusätzlichen Schlüssels kann die Reihenfolge der vorhandenen Schlüssel ändern. Dies führt zu extrem schwer zu debuggenden Problemen.

Ein besserer Ansatz wäre es, die Artikel für Ihren Picker in einen bestellten Container zu stellen, z. B. NSArray.Erstellen Sie eine spezielle Klasse für die Kommissionierer Artikel, zum Beispiel

@interface MyPickerItem : NSObject 
@property (readwrite, nonatomic) NSString *item1; 
@property (readwrite, nonatomic) NSString *item2; 
@end 

ein NSArray solcher MyPickerItem Objekte aus dem Wörterbuch erstellen, bestellen sie so, wie Sie wollen, im Picker Ansicht angezeigt werden (beispielsweise alphabetisch nach item1, dann von item2) und NSArray als Datenquelle für Ihre Picker Ansicht verwenden: macht nicht viel Sinn

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    MyPickerItem *p = myArray[row]; 
    switch (component) { 
     case 0: return p.item1; 
     case 1: return p.item2; 
    } 
    return @"<-ERROR->"; 
} 
1

Nein, da ein Wörterbuch keine Reihenfolge hat.

Sie müssen eine Reihe von Schlüsseln angeben, die neben dem Wörterbuch auch Ihre Bestellung enthalten.

@interface MyClass() 
@property NSMutableArray *keysArray;  // Don't forget to allocate this in an init method 
@end 

- (NSString *)pickerView:(UIPickerView *)pickerView 
      titleForRow:(NSInteger)row 
      forComponent:(NSInteger)component 
{ 
    if (component == 0){ 
     NSString *key = self.keysArray[row]; 
     return self.myDict[key]; // I assume you just want to return the value 
    } 
    ... 
+2

+1 für die Erinnerung über das Zuweisen des 'NSMutableDictionary'. die Anzahl der Male, in denen ich mich selbst verrückt gemacht habe, weil ich vergessen habe, das zu tun ... –

1

NSDictionary ist eine ungeordnete Datenstruktur, die bedeutet, dass mit einem Index zugreifen. Sie möchten wahrscheinlich eine NSArray stattdessen. Wenn Ihr Wörterbuch jedoch NSNumbers als Schlüssel verwendet, würden Sie so darauf zugreifen.

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ 
    if (component == 0) { 
     return [NSString stringWithFormat:@"%@", myDict[@(row)]]; 
    } 
} 
3

Dies wird Ihnen zufällig geordneten Schlüssel

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ 
    if (component == 0){ 
     return [NSString stringWithFormat:@"%@",[myDict allKeys][row]]; 
    } 
} 
Verwandte Themen