18

Witam Próbuję stworzyć fourates list z obiektu restauracji, moja aplikacja ma listę różnych restauracji, chcę, aby użytkownicy mogli dodawać ulubione restauracje, a ten kod jest nie działaPróba wstawienia wartości niezwiązanej z nieruchomościami Cel C

- (IBAction)toggleFav:(id)sender { 

    Restaurant *resto = [self restaure]; 

    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; 
    [dic setObject:resto.price forKey:@"restoPrice"]; 
    [dic setObject:resto.restaurantId forKey:@"restaurantId"]; 
    [dic setObject:resto.restoAbout forKey:@"restoAbout"]; 
    [dic setObject:resto.restoAddress forKey:@"restoAddress"]; 
    [dic setObject:resto.restoBeverages forKey:@"restoBeverages"]; 
    [dic setObject:resto.restoCategory forKey:@"restoCategory"]; 
    [dic setObject:resto.restoEmail forKey:@"restoEmail"]; 
    [dic setObject:resto.restoLogo forKey:@"restoLogo"]; 
    [dic setObject:resto.restoName forKey:@"restoName"]; 
    [dic setObject:resto.restoPhone forKey:@"restoPhone"]; 
    [dic setObject:resto.restoCity forKey:@"restoCity"]; 

    NSArray *dicArray = [dic allKeys]; 


    if([sender isSelected]){ 
     //... 
     [sender setSelected:NO]; 
     NSMutableArray *array = [[[NSUserDefaults standardUserDefaults] objectForKey:@"restoName"] mutableCopy]; 
     [array removeObject:dicArray]; 
     [[NSUserDefaults standardUserDefaults] setObject:array forKey:@"restoName"]; 

    } else { 
     //... 
     [sender setSelected:YES]; 
     NSMutableArray *array = [[[NSUserDefaults standardUserDefaults] objectForKey:@"restoName"] mutableCopy]; 
     [array addObject:dicArray]; 
     [[NSUserDefaults standardUserDefaults] setObject:array forKey:@"restoName"]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 

     //NSLog(@"%@",[[NSUserDefaults standardUserDefaults] stringForKey:@"restoName"]); 
    } 
} 

"z klasy" __NSCFArray ". Zauważ, że słowniki i tablice na listach właściwości muszą również zawierać tylko wartości właściwości.

+2

Sprawdź słownika jest jakieś wartości null lub nie? – Exploring

Odpowiedz

17

Można przechowywać tylko typy list właściwości (tablica, dane, ciąg, liczba, data, słownik) lub adresy URL w NSUserDefaults. Konieczne będzie przekonwertowanie obiektu modelu na te.

+0

Jak to zrobić, przepraszam – mavusane

+3

Można utworzyć NSDictionary i umieścić na nim wszystkie właściwości obiektu, na przykład. Lub możesz zaimplementować NSCoding i użyć go, byłoby to podobne (powinno być na nim dużo dokumentów, szukaj NSKeyedArchiver jeśli NSCoding ich nie znajdzie) –

+0

Cześć, zobacz mój kod powyżej Stworzyłem tablicę, ale wciąż ten sam problem , nie mogę uwierzyć, że 3 pełne dni próbują tego, Przy metodzie kodowania nie mam pewności, gdzie umieścić NSObject , ponieważ moja klasa detailView implementuje ten @ interfejs FacetViewViewController: UIViewController – mavusane

57

Jeśli nie chcesz się martwić o zapewnienie wszystkim słownika wartości są typy list nieruchomość, to może po prostu przekonwertować słownika do NSData,

NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
[def setObject:[NSKeyedArchiver archivedDataWithRootObject:self.myDictionary] forKey:@"MyData"]; 
[def synchronize]; 

I wrócić do słownika z piaskownicy :

NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
NSData *data = [def objectForKey:@"MyData"]; 
NSDictionary *retrievedDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
self.myDictionary = [[NSDictionary alloc] initWithDictionary:retrievedDictionary]; 

Mam nadzieję, że to komuś pomaga. : D


DODATKOWE UWAGA: Jeśli otrzymujesz zmienny słownika lub zmienny tablicę, po czym należy pamiętać, aby używać „mutableCopy” metody. W przeciwnym razie nie można dodawać ani usuwać obiektów z wyszukanego słownika/tablicy. Na przykład:

NSMutableDictionary *retrievedDictionary = 
[[NSKeyedUnarchiver unarchiveObjectWithData:data] mutableCopy]; 

Albo

NSMutableArray *retrievedArray = 
[[NSKeyedUnarchiver unarchiveObjectWithData:data] mutableCopy]; 
+4

Dzięki, zaoszczędziło mi to bólu głowy lub trzech. – mmr

+1

Szybkie i proste rozwiązanie. Dzięki. – user3344977

+2

To powinno być akceptowane .. Dziękuję bardzo @Rocotilos. – TamilKing