web-dev-qa-db-fra.com

Tentative d'insérer une valeur hors propriété Objectif C

Salut, j'essaie de créer une liste fourates à partir d'un objet restaurants, mon application a une liste de différents restaurants, je veux que les utilisateurs puissent ajouter des restaurants favoris, et ce code ne fonctionne pas

- (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"]);
  }
}

'de la classe' __NSCFArray '. Notez que les dictionnaires et les tableaux dans les listes de propriétés doivent également contenir uniquement des valeurs de propriété.

20
mavusane

Si vous ne voulez pas vous assurer que toutes les valeurs de votre dictionnaire sont les types de liste de propriétés, vous pouvez simplement convertir le dictionnaire en NSData,

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

Et pour revenir dans un dictionnaire à partir du bac à sable:

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

J'espère que cela aide quelqu'un. :RÉ


NOTE ADDITIONNELLE: Si vous obtenez un dictionnaire ou un tableau mutable, n'oubliez pas d'utiliser la méthode "mutableCopy". Sinon, vous ne pouvez pas ajouter ou supprimer des objets de votre dictionnaire/tableau récupéré. Par exemple:

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

Ou

NSMutableArray *retrievedArray = 
[[NSKeyedUnarchiver unarchiveObjectWithData:data] mutableCopy];
57
GeneCode

Vous ne pouvez stocker que les types de liste de propriétés (tableau, données, chaîne, nombre, date, dictionnaire) ou les URL dans NSUserDefaults. Vous devrez convertir votre objet modèle en ceux-ci.

18
Catfish_Man