2014-05-14 13 views
9

È possibile ottenere una chiave di dizionario per indice?Ottenere la chiave NSDictionary per indice?

Sto cercando di utilizzare un dizionario per l'origine dati di una vista raccoglitrice e vogliono accedervi in ​​seguito metodo delegato:

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

EDIT--

myDict è qualcosa di simile:

articolo 1

  • elemento sub 1
  • sub voce 2

Articolo 2

  • voce secondaria 1
  • sub voce 2

voglio usare myDict come l'origine dati per una vista selettore che ha 2 sezioni:

sezione 0 = chiavi myDict (elemento 1, elemento 2)

sezione 1 = valori myDict corrispondenti per la sezione selezionata riga 0 (sotto voce 1, sotto voce 2)

+3

Che cosa si intende per ottenere chiave del dizionario in base all'indice? Che ne dici di elaborarlo di più mostrando un esempio o più codice? – Ricky

+3

I dizionari non hanno un indice, è possibile utilizzare il metodo allKeys per ottenere un array di chiavi. – rdelmar

+0

Leggere le specifiche NSDictionary e vedere quali funzioni sono disponibili. –

risposta

21

Da NSDictionary è un contenitore associativo ordinata , essa ha il concetto di indicizzazione. Le sue chiavi sono ordinate in modo arbitrario e quell'ordine può cambiare in futuro.

È possibile ottenere una NSArray di chiavi dal dizionario e applicare l'indicizzazione ad esso:

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

Tuttavia, questo schema di indicizzazione rimarrebbe coerente solo fino a quando il dizionario rimane invariato: per esempio, se si utilizzare NSMutableDictionary, aggiungere una chiave in più può modificare l'ordine delle chiavi esistenti. Questo porta a problemi estremamente difficili da correggere.

Un approccio migliore sarebbe quello di posizionare gli elementi per il raccoglitore in un contenitore ordinato, ad esempio NSArray.Creare una classe speciale per le voci picker, ad esempio

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

creare un NSArray di tali MyPickerItem oggetti dal vostro dizionario, ordinare loro il modo in cui si desidera vengano visualizzati nella vista picker (per esempio, in ordine alfabetico per item1, allora da item2) e usare NSArray come l'origine dati per la visualizzazione raccoglitrice:

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

No, come un dizionario non ha ordine.

Dovrai fornire una serie di chiavi, che ti forniranno l'ordine, oltre al dizionario.

@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 per il promemoria sull'assegnazione di 'NSMutableDictionary'. il numero di volte in cui mi sono impazzito perché mi sono dimenticato di farlo ... –

1

NSDictionary è una struttura di dati non ordinata che significa che l'accesso con un indice non molto senso. Probabilmente vorrai un NSArray. Tuttavia, se il tuo dizionario utilizza NSNumbers come chiavi, accederai in questo modo.

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

Questo vi darà le chiavi ordinate casualmente

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