IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Objective-C Discussion :

Utilisation de NSUserDefaults [Objective-C]


Sujet :

Objective-C

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut Utilisation de NSUserDefaults
    Bonjour
    J'utilise un NSuserDefault pour stocker un NSMutableArray(contenant des produits) sous la clé produits:

    par defaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    NSUserDefaults *prefs=[NSUserDefaults  standardUserDefaults];
    NSData *nsdataMT = [NSKeyedArchiver archivedDataWithRootObject:tableauproduits];
    [prefs setObject:nsdataMT forKey:@"produitsFav"];
    ensuite je récupère le contenu du NSuser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NSData *nsdatafv = (NSData *)[prefs objectForKey:@"produitsFav"];
    NSMutableArray *tableaufavoritesVenues = [NSKeyedUnarchiver unarchiveObjectWithData:nsdatafv];
    mais lors de la récupération si l'objet produitsFav n'existe pas la ligne en rouge bugue.
    comment je fais pour tester si la clés en question existe avant de l'utiliser?

    J'ai déjà essayé çà et çà marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(![prefs boolForKey:@"produitsFav"]) ...
    Merci d'avance pour votre aide

  2. #2
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    Return Value
    The object associated with the specified key, or nil if the key was not found.
    Donc ce que vous faites ne devrait jamais planter, sauf si 'prefs' n'est plus valide. Mais vous ne donnez pas le code entre les deux morceaux donc on ne peut rien vous dire de plus pour l'instant.

  3. #3
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    au viewdid load je fais ça:

    if(![prefs boolForKey:@"produitsFav"]) pour tester s'il l'objet existe déja.

    si oui je récupére "produitsFav" qui est un NSMutableArray et je travaille avec

    sinon je crée un nouveau NSMutableArray.
    et à la fin je le remet dans le NSUserDefault.

  4. #4
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    -boolForKey: permet de récupérer la valeur booléenne associée à la clé que tu donnes. Pas de savoir s'il existe un 'objet' associé à cette clé.

    Tu n'as aucun moyen de vérifier si un 'objet' est attaché à cette clé autrement qu'en testant si -objectForKey: renvoie nil ou pas.

    Qu'est-ce qui se passe si tu remplaces la ligne en rouge par ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NSData *nsdatafv = (NSData *)[[NSUserDefaults standardUserDefaults] objectForKey:@"produitsFav"];

  5. #5
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    bon le probleme n'es pas dans la récupération. parceque lorsque mon objet existe tout marche tres bien. mais s'il n'existe pas je reçois erreur.
    ->si on admet ce que vous avez dîtes Monsieur Ceylo:
    -boolForKey: permet de récupérer la valeur booléenne associée à la clé que tu donnes. Pas de savoir s'il existe un 'objet' associé à cette clé.
    cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(![prefs boolForKey:@"produitsFav"]) ...
    doit retourner FALSE si la clé booléen n'existe pas et non pas erreur.

    est ce que vous êtes d'accord avec moi?

  6. #6
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    boolForKey:
    Returns the Boolean value associated with the specified key.

    - (BOOL)boolForKeyNSString *)defaultName
    Parameters
    defaultName
    A key in the current user's defaults database.
    Return Value
    If a boolean value is associated with defaultName in the user defaults, that value is returned. Otherwise, NO is returned.
    Si -boolForKey: renvoie NO, cela signifie qu'il n'y a pas de booléen associé à cette clé, ou que la valeur booléenne associée à cette clé est 'NO'. Cela ne veut pas dire qu'il n'y a aucune valeur (d'une autre type) associée à cette clé.

  7. #7
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    mais moi je reçois erreur et l'application s'arrete et non pas NO

    et dans la console il y'a :
    EXC_BAD_ACCESS sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(![prefs boolForKey:@"produitsFav"])

  8. #8
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    C'est pour ça que je dis que le crash ne vient pas de la façon dont vous utilisez la méthode, mais du fait que la variable 'prefs' soit invalide (a priori).

    D'où également mon précédent post où je vous demande ce qu'il se passe si vous remplacez 'prefs' par '[NSUserDefaults standardUserDefaults]'.

  9. #9
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    oui vous avez raison l'objet était invalide car j'avais déclaré un autre objet avec le même nom sur le même viewcontroller et j'ai mis :
    [pref release]; au début;

    lorsque j'ai éliminé le premier objet ça a marché

    je suis toujours entrain de tester et comprendre. je vous mettrai au courant bientot

  10. #10
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    voici le code que j'utilise maintenant:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    self.prefs= [NSUserDefaults standardUserDefaults]:
    	NSMutableArray *Produits=[[NSMutableArray alloc] init];
    	if([self.prefs boolForKey:@"FavoritProduitExist"]!=nil )
    	{
    		NSData *nsdatafvP = (NSData *)[prefs objectForKey:@"FavoritProduits"];
    		self.tableaufavoritesProduits = [NSKeyedUnarchiver unarchiveObjectWithData:nsdatafvP];
    		NSLog(@"%@",tableaufavoritesProduitss);
    	}
    	else 
    	{
    		self.tableaufavoritesProduits = [[NSMutableArray alloc]init];
    	}

  11. #11
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    1. -[NSUserDefaults boolForKey:] renvoie une booléen, que vous comparez à un pointeur... nil. -boolForKey: renvoie NO ou YES, et rien d'autre.

    2. -[NSUserDefaults objectForKey:] renvoie l'objet ou nil. Donc vous risquez d'utiliser un pointeur nul avec votre code.

    3. Vous avez deux entrées dans vos préférences alors qu'une seule entrée suffit. Il vous suffirait de tester la valeur de retour de -objectForKey:. D'une cela évite les erreurs incohérentes (si -boolForKey:@"FavoritProduitExist" renvoie YES par ex alors que l'objet associé à la clé @"FavoritProduits" n'existerait pas), et de deux vous êtes sûr que l'objet 'nsdatafvP' que vous utilisez est valide.

    4. La première ligne de votre code comporte un ':' au lieu de ';' à la fin.

    5. Il y aurait encore d'autres remarques (moins importantes) à faire sur ce simple bout de code mais cela sort du cadre de la question.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    self.prefs = [NSUserDefaults standardUserDefaults];
    NSMutableArray *Produits = [[NSMutableArray alloc] init];
    NSData *nsdatafvP = (NSData *)[prefs objectForKey:@"FavoritProduits"];
     
    if (nsdatafvP != nil)
    {
        self.tableaufavoritesProduits = [NSKeyedUnarchiver unarchiveObjectWithData:nsdatafvP];
        NSLog(@"%@",tableaufavoritesProduitss);
    }
    else 
    {
        self.tableaufavoritesProduits = [[NSMutableArray alloc] init];
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation NSUserDefaults avec un pickerView
    Par acrob dans le forum Développement iOS
    Réponses: 3
    Dernier message: 30/11/2014, 12h53
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo