2013-04-07 14 views
18

Hallo, ich versuche, eine Viererliste aus einem Restaurantobjekt zu erstellen, meine Anwendung hat eine Liste mit verschiedenen Restaurants, ich möchte die Möglichkeit für Benutzer, Lieblingsrestaurants hinzuzufügen, und dieser Code ist funktioniert nichtVersuch, einen Nicht-Eigenschaftswert einzufügen Ziel 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"]); 
    } 
} 

'der Klasse' __NSCFArray '. Beachten Sie, dass Wörterbücher und Arrays in Eigenschaftslisten auch nur Eigenschaftswerte enthalten müssen.

+2

Überprüfen Sie Ihr Wörterbuch ist es NULL-Werte oder nicht? – Exploring

Antwort

17

Sie können nur Eigenschaftslistentypen (Array, Daten, Zeichenfolge, Zahl, Datum, Wörterbuch) oder URLs in NSUserDefaults speichern. Sie müssen Ihr Modellobjekt in diese konvertieren.

+0

Wie mache ich das, Entschuldigung – mavusane

+3

Sie könnten ein NSDictionary machen und alle Eigenschaften Ihres Objekts zum Beispiel darin setzen. Oder Sie könnten NSCoding implementieren und verwenden, es wäre ähnlich (sollte viel docs darauf sein; suchen Sie nach NSKeyedArchiver, wenn NSCoding sie nicht findet) –

+0

Hallo Kumpel sehe meinen Code oben Ich habe ein Array erstellt, aber immer noch das gleiche Problem Ich kann nicht glauben, dass es 3 volle Tage versucht. Mit der Kodierungsmethode bin ich mir nicht sicher, wo ich NSObject setzen soll, weil meine detailView Klasse dieses @interface implementiert. DetailViewController: UIViewController – mavusane

57

Wenn Sie nicht darum, sicherzustellen, alle Ihre Wörterbuch Werte die Eigenschaft Listentypen sind stören wollen, dann können Sie einfach das Wörterbuch in NSData konvertieren,

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

und zurück in einem Wörterbuch von Sandbox zu bekommen :

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

Hoffe, das hilft jemandem. : D


ZUSÄTZLICHE ANMERKUNG: Wenn Sie ein veränderliches Wörterbuch oder änderbaren Array bekommen, dann denken Sie daran "mutableCopy" Methode zu verwenden. Andernfalls können Sie keine Objekte aus dem abgerufenen Wörterbuch/Array hinzufügen oder löschen. Zum Beispiel:

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

Oder

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

Danke, das hat mir Kopfschmerzen gerettet oder drei. – mmr

+1

Schnelle und einfache Lösung. Vielen Dank. – user3344977

+2

Dies sollte akzeptiert werden .. Vielen Dank @Rocotilos. – TamilKing