2013-05-22 17 views
5

Come si aggiungono più oggetti alla stessa chiave in uno NSMutableDictionary? Non riesco a trovare il metodo giusto. Il metodo setObject aggiorna solo un singolo oggetto nell'array delle chiavi. Il metodo addObject: forkey: nello NSMutableDictionary non è disponibile e causa un arresto anomalo quando viene utilizzato.NSMutableDictionary Aggiunta di più oggetti a un tasto

Il dizionario viene letto da un file plist.

Dictionary:

temp = { 
    nickname : score 
     item 0 = level1; 
     item 1 = level2; 
     item 3 = level3; 
    score 
     item 0 = 400; 
     item 1 = 400; 
     item 3 = 400; 
} 

Ecco il codice:

NSMutableDictionary *newDict = [[NSMutableDictionary alloc] init]; 
str_nickname = [temp objectForKey:@"nickname"]; 
for (NSString *key in str_nickname){ 
    if ([key isEqualToString:@"level2"]) { //replace object with new name 
     [newDict setObject:@"new level" forKey:@"nickname"]; 
    } else { 
     [newDict addObject:key forKey:@"nickname"]; //wont work!!! 
    } 
} 

Anche io voglio aggiornare il nuovo punteggio nel nuovo dizionario e devono aggiornare questo a livello-oggetto corrispondente, forse dall'indice?

+0

Hai definito bene le tue strutture dati? In caso affermativo, che aspetto ha quel design? Sapendo che sarebbe molto più facile aiutarti. – Monolo

+1

Pensa a questo: dopo aver impostato due oggetti diversi per la stessa chiave, cosa vuoi che il dizionario ti dia quando chiedi 'objectForKey:'? –

risposta

1

se il file plist è come questo "test.plist"

The Dictionary temp={ 
    nickname : Junaid Sidhu 

    levels 
      item 0 = level1; 
      item 1 = level2; 
      item 3 = level3; 
    score 
      item 0 = 400; 
      item 1 = 400; 
      item 3 = 400; 
    } 

Ecco il codice

NSDictionary *temp = [[NSDictionary alloc]initWithContentsOfFile:[NSBundle mainBundle] pathForResource:@"test" ofType:@"plist"]]; 

NSMutableDictionary *newDict = [[NSMutableDictionary alloc] init]; 

NSString *str_nickname = [temp objectForKey:@"nickname"]; 
NSMutableArray *levels = [NSMutableArray new]; 
NSMutableArray *score = [NSMutableArray new]; 

for (NSString *key in [temp allKeys]){ 

    if ([key isEqualToString:@"levels"]) { //replace object with new name 

      levels = [NSMutableArray arrayWithArray:(NSArray *)[temp objectForKey:key]]; 

    } 
    else if ([key isEqualToString:@"score"]){ 

      score = [NSMutableArray arrayWithArray:(NSArray *)[temp objectForKey:key]]; 

    } 
} 

NSLog(@"Nick : %@ \n levels : %@ \n score : %@ \n",str_nickname,levels,score) 
+0

voglio usare un file plist per memorizzare i punteggi di livello di un puzzle game. Ho provato questo con NSUserdefaults, che funziona più o meno con la stessa struttura. La mia domanda: sono sulla strada giusta, o dovrei usare un altro metodo per la memorizzazione dei dati di gioco? Sono abbastanza nuovo con xcode, ma ho una ricerca per ore –

+0

sì, è possibile utilizzare UserDefaults ma NSCoder è il migliore – junaidsidhu

+0

Grazie JayD! –

2

se si vuole avere più oggetti memorizzati sotto la stessa chiave in un dizionario, la tua unica possibilità li sta mettendo in un array

  • altro dizionario
  • impostato
  • bag
  • qualsiasi tipo di collezione che desideri

a e lo memorizzi nel tuo dizionario. La ragione è che i dizionari sono valori-valore-PAIRINGS. L'intera architettura non è progettata per supportare una chiave che corrisponde a più di un oggetto. Gli oggetti sarebbero indistinguibili per il sistema, quindi niente dadi.

MODIFICA: Se si desidera accedere all'oggetto utilizzando un indice, credo che la soluzione migliore sia la versione dell'array. Memorizza una matrice mutabile nel tuo dizionario per la chiave "nickname", quindi aggiungi oggetti a quell'array. Per memorizzare:

[myDictionary setObject:[NSMutableArray array] ForKey:@"nickname"]; 
[[myDictionary objectForKey:@"nickname"] addObject:yourObject]; 

Per recuperare:

[[myDictionary objectForKey:@"nickname"] objectAtIndex:index];