[Résolu] NSUserDefauls retourne une valeur fausse

berfisberfis Membre
février 2015 modifié dans API AppKit #1

Bonjour,


 


Il m'arrive un de ces trucs agaçants.


 


Dans mon fichier de préférences, je stocke une valeur d'index pour un groupe de boutons-radio.comme


 


Lancement de l'application:


o Ne rien ouvrir


o Ouvrir un document sans titre


o Ouvrir le document: [nom du document]


 


Je récupère cette valeur au lancement de l'application:



long option = [[NSUserDefaults standardUserDefaults] integerForKey:@openingOption];

Et là , surprise, j'obtiens ceci:


 


(Valeur de la clé, bouton sélectionné, valeur retournée par l'appel)


0    0    0


1    1    0


2    2    2


 


Une idée ?


Mots clés:

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur

    ^^Attends, Ali a une boule de cristal je crois  ;D


     


    Plus sérieusement, comment pourrait on avoir une idée ? Ou alors j'ai pas compris la question ?


  • Joanna CarterJoanna Carter Membre, Modérateur
    Il faut plus d'infos
  • AliGatorAliGator Membre, Modérateur
    long ... = ... integerForKey

    Ca me parait déjà  pas très cohérent...

  • NSInteger option = [[NSUserDefaults standardUserDefaults] integerForKey:@openingOption];

    donne le même résultat... De toute façon si je mets int le compilateur râle.


     


    Plus d'infos... désolé, mais c'est tout ce que j'ai. Une valeur de préférences qui retourne 0 alors qu'elle devrait retourner 1. Mais qui retourne 2... ou 3 ou 4...


     


    Voici la routine d'appel:



    // -(BOOL)applicationShouldOpenUntitledFile:(NSApplication*)app
    // {
    NSInteger option = [[NSUserDefaults standardUserDefaults] integerForKey:@openingOption];
    NSLog(@open %ld,option);
    if (option==0) return NO;
    else if (option == 1) return YES;
    else
    {
    NSData *data = [[NSUserDefaultsController sharedUserDefaultsController]valueForKeyPath:@values.defaultRegisterPath];
    if (data)
    {
    NSURL *theURL = [NSUnarchiver unarchiveObjectWithData:data];
    NSLog(@open %@",theURL);
    }
    return NO;
    }
    }

    Je ne vois pas quoi vous donner d'autre. 


  • Joanna CarterJoanna Carter Membre, Modérateur
    Mais tu n'as pas encore nous montré ce qu tu as mis dans ton NSUserDefaults
  • Est-ce que la valeur est bonne dans le plist ?


  • AliGatorAliGator Membre, Modérateur
    Et le setInteger:forKey: il est appelé où et comment ? Tu es sûr que tu mets bien 1 dedans ?
  • Le selected Index du groupe de boutons-radio est lié par binding au shared User Defaults Controller, par la clé values:openingOption (validates immediately).


     


    Le plus fort, c'est que le bouton-radio sélectionné du groupe est correctement enregistré. Quand je relance l'application, la valeur est correcte.


     


    En fait, j'ai remarqué quelque chose d'encore plus étrange: quand je sélectionne 1 (qui est la valeur par défaut) l'application me retourne 0 parce que la clé disparaà®t de la plist !


     


    Je mentionne encore ceci (c'est la 2e méthode de mon AppDelegate qui n'en compte que deux):



    // - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    // {
    NSURL *defaultPrefsFile = [[NSBundle mainBundle] URLForResource:@Defaults withExtension:@plist];
    NSDictionary *defaultPrefs = [NSDictionary dictionaryWithContentsOfURL:defaultPrefsFile];
    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultPrefs];
    [[NSUserDefaultsController sharedUserDefaultsController]setInitialValues:defaultPrefs];
    }

    Ghost in the machine...


  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2015 modifié #10
    Pourquoi pas lire et écrire les NSUserDefaults directement du/au disque ?
  • C'est ce que je fais. Le code dans applicationDidFinishLaunching est là  pour installer les valeurs "d'usine", quand l'application est lancée pour la première fois et qu'aucun fichier de préférences n'existe, ou que l'utilisateur n'a pas encore modifié l'une des valeurs.


     


    Mais en règle générale, depuis que les préférences sont mises en cache (Mavericks?), j'ai l'impression de ne plus rien maà®triser...


  • Quitté Xcode, redémarré, et ça roule. Ce n'était pas dans le code, mais franchement je n'ai pas envie d'investiguer plus loin. Entre un Xcode beta et un MacOS beta, tant de choses peuvent arriver... On n'est plus au temps du système 6 et de ResEdit, et je bosse à  plein temps dans un tout autre domaine. Merci en tout cas de votre réjouissante réactivité!


  • Joanna CarterJoanna Carter Membre, Modérateur
    Bah voilà  ! Mais de curiosité, qu'est-ce que tu as utilisé en Xcode pour déterminer les valeurs "fausses" ?
  • Des NSLog...


    Et j'ai rajouté un NSTextField pour afficher la valeur (des fois que NSMatrix, dont la mort est annoncée, stocke le selected index ailleurs).


     


    Pour moi c'était une affaire de cache corrompu.


     


    De toute façon j'ai la tête un peu farcie en ce moment, en plus du boulot je suis un cours pour programmer du Core Data en Swift sur iOS, en utilisant storyboard alors voila, voila... Comme disait le Concombre masqué : "Oeuf mou! J'ai la tête qui pète"...


Connectez-vous ou Inscrivez-vous pour répondre.