2013-05-22 22 views
5

Jak dodać wiele obiektów do tego samego klucza w pliku NSMutableDictionary? Nie mogę znaleźć właściwej metody. Metoda setObject aktualizuje tylko jeden obiekt w tablicy kluczy. Metoda addObject: forkey: w NSMutableDictionary jest niedostępna i powoduje awarię, gdy jest używana.NSMutableDictionary Dodawanie wielu obiektów do jednego klucza

Słownik jest czytany z pliku plist.

słownika:

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

Oto kod:

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!!! 
    } 
} 

Również chcę zaktualizować nową ocenę w nowym słowniku i trzeba zaktualizować to na odpowiednim poziomie-obiektu, może według indeksu?

+0

Czy dobrze zdefiniowałeś swoje struktury danych? Jeśli tak, jak wygląda ten projekt? Wiedząc, że o wiele łatwiej będzie ci pomóc. – Monolo

+1

Zastanów się: po ustawieniu dwóch różnych obiektów dla tego samego klucza, co chcesz, aby słownik dał Ci, gdy poprosisz o 'objectForKey:'? –

Odpowiedz

1

jeśli plik plist jest jak ten "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; 
    } 

Oto kod

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

Chcę użyć pliku plist do przechowywania wyników poziomu gry puzzle. Próbowałem tego z NSUserdefaults, który działa mniej więcej o tej samej strukturze. Moje pytanie: czy jestem na właściwej ścieżce, czy też powinienem użyć innej metody przechowywania danych gry? Jestem całkiem nowy z Xcode, ale mam wyszukiwanie godzin –

+0

Tak, możesz użyć UserDefaults, ale NSCoder jest najlepszy – junaidsidhu

+0

Dziękuję JayD! –

2

jeśli chcesz mieć wiele obiektów przechowywanych w ramach tego samego klucza w słowniku, to jedyna szansa jest umieszczenie ich w

  • tablicy
  • drugiej słowniku
  • ustawiony
  • worek
  • dowolny rodzaj kolekcji, który lubisz

a i przechowuj to w słowniku. Powód jest taki, że słowniki są kluczowymi wartościami PAIRINGS. Cała architektura nie jest obsługiwana przez klucz, który odpowiada więcej niż jednemu obiektowi. Obiekty byłyby nieodporne na system, w związku z czym nie ma kości.

EDYTOWANIE: Jeśli chcesz uzyskać dostęp do obiektu za pomocą indeksu, domyślam się, że najlepiej będzie mieć wersję Array. Zapisz w słowniku słownik Mutable Array dla klucza "pseudonim", a następnie dodaj Obiekty do tej tablicy. Zapisywanie:

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

Aby pobrać:

[[myDictionary objectForKey:@"nickname"] objectAtIndex:index]; 
Powiązane problemy