Comment stocker une checkbox dans une plist comme BOOL?

uocramuocram Membre
23:42 modifié dans API AppKit #1
Pouvez-vous me donner la manière de stocker la valeur d'une checkbox dans un BOOL contenu dans le dictionary d'une plist qui n'est pas celle de l'utilisateur?

L'équivalent de cela :

[[NSUserDefaults standardUserDefaults] setBool:[myCheckBox state] forKey: myCheckBoxValueKey];

mais pour un dictionary quelconque dans un fichier .plist autre que celui de l'application.
D'avance merci.

Réponses

  • ChachaChacha Membre
    23:42 modifié #2
    dans 1109603465:

    mais pour un dictionary quelconque dans un fichier .plist autre que celui de l'application.
    D'avance merci.


    Je ne suis pas sûr d'avoir très bien compris : tu crées un fichier plist à  la main ? Parce que je vois plusieurs interprétations du problème :

    -soit tu es effectivement en train de créer un fichier plist entièrement à  la main, et tu utilises les méthodes associées au protocole NSCoding (pour l'archivage de fichiers)

    -soit tu as créé une plist en mémoire (avec les méthodes et types de CoreFoundation, genre CFPropertyListRef), et tu dois utiliser les types CoreFoundation correspondants.

    j'ai dit des bêtises ?

    +
    Chacha
  • muqaddarmuqaddar Administrateur
    23:42 modifié #3
    bonjour et bienvenue uocram.
    un truc de ce genre ?

    [[myDico objectForKey:@theBoolKey] setBool:[myCheckBox state] forKey: myCheckBoxValueKey];
  • uocramuocram Membre
    23:42 modifié #4
    dans 1109603890:

    bonjour et bienvenue uocram.
    un truc de ce genre ?

    [[myDico objectForKey:@theBoolKey] setBool:[myCheckBox state] forKey: myCheckBoxValueKey];



    Merci pour votre réponse rapide à  tous deux.
    Je souhaite écrire ma valeur dans un fichier .plist déjà  créé qui n'est pas le fichier de préférences de mon application, donc que je ne peux pas atteindre avec [NSUserDefaults standardUserDefaults]
    oxitan :
    Ce serait cela, mais il semble qu'un NSMutableDictionary ne puisse pas répondre à  -setBool:forKey:
    Seul un NSUserDefaults le peut (d'après ce que je j'obtiens dans le Built result).

    Autre possibilité?
  • ChachaChacha Membre
    23:42 modifié #5

    Je souhaite écrire ma valeur dans un fichier .plist déjà  créé qui n'est pas le fichier de préférences de mon application, donc que je ne peux pas atteindre avec [NSUserDefaults standardUserDefaults]


    En fait je n'ai toujours pas très bien compris. Sur quelles données travailles-tu ? Veux-tu simplement stocker une valeur booléenne dans un NSDictionary, indépendamment de ton contexte de plist ?
    Dans ce cas, comme le NSDictionary ne peut stocker que des objets, il faut encapsuler le BOOL dans un NSNumber.
    Je n'ai jamais vérifié si cela pouvait être automatique, mais tu peux faire la chose suivante:
    NSNumber* boolObject = [NSNumber numberWithBool:[myCheckBox state]];
    [myDico setObject:boolObject forKey:@theBoolKey];

    Et pour décoder :
    NSNumber* boolObject = [myDico objectForKey:@theBoolKey];
    [myCheckBox setState:[boolObject boolValue]];
  • uocramuocram Membre
    23:42 modifié #6
    dans 1109605466:


    NSNumber* boolObject = [NSNumber numberWithBool:[myCheckBox state]];
    [myDico setObject:boolObject forKey:@theBoolKey];

    Et pour décoder :
    NSNumber* boolObject = [myDico objectForKey:@theBoolKey];
    [myCheckBox setState:[boolObject boolValue]];


    C'est exactement ce qu'il me faut.
    Merci beaucoup Chacha.
  • ClicCoolClicCool Membre
    23:42 modifié #7
    dans 1109605466:

    NSNumber* boolObject = [NSNumber numberWithBool:[myCheckBox state]];
    [myDico setObject:boolObject forKey:@theBoolKey];

    Et pour décoder :
    NSNumber* boolObject = [myDico objectForKey:@theBoolKey];
    [myCheckBox setState:[boolObject boolValue]];


    En théorie ne faudrait-il pas écrire plutot:
    NSNumber* boolObject = [NSNumber numberWithBool:([myCheckBox state]==NSOnState) ];
    


    la valeur réelle de NSOnState n'étant pas garantie, sans compter qu'il faut parfois compter avec NSMixedState aussi parfois.
  • ChachaChacha Membre
    23:42 modifié #8
    dans 1109626923:

    En théorie ne faudrait-il pas écrire plutot:
    NSNumber* boolObject = [NSNumber numberWithBool:([myCheckBox state]==NSOnState) ];
    


    la valeur réelle de NSOnState n'étant pas garantie, sans compter qu'il faut parfois compter avec NSMixedState aussi parfois.


    Oh là , oui, tu as raison je pense. le "state" d'un checkBox est un int, pas un bool.
    Donc autant stocker un int avec <numberWithInt> et le récupérer avec <intValue>
  • ClicCoolClicCool Membre
    23:42 modifié #9
    dans 1109627432:

    Donc autant stocker un int avec <numberWithInt> et le récupérer avec <intValue>


    Oui c'est certainement le plus propre finalement Chacha
  • ClicCoolClicCool Membre
    23:42 modifié #10
    Quoique ....

    En fait la finalité d'un enregistrement de donnée sur disque n'est pas d'enregistrer la valeur exacte actuelle de NSOnState ou autre valeur spécifique à  Cocoa.

    Ce serait plutôt de savoir si telle condition est vraie, fausse, ou éventuellement indéterminée.
    Pour la pérénité des données sauvegardées un fichier doit contenir la valeur "humaine" vraie/fausse/indéterminée, ou bien Male/Femelle etc ...

    Charge après au logiciel qui lit les données de dire
    si Male alors NSOnstate
    sinon NSOffState

    C'est la seule façon de s'affranchir véritablement de la valeur possiblement changeante un jour de NSOnState en respectant les données réelles manipulées par le soft.
  • uocramuocram Membre
    23:42 modifié #11
    dans 1109628067:

    Quoique ....

    En fait la finalité d'un enregistrement de donnée sur disque n'est pas d'enregistrer la valeur exacte actuelle de NSOnState ou autre valeur spécifique à  Cocoa.

    Ce serait plutôt de savoir si telle condition est vraie, fausse, ou éventuellement indéterminée.
    Pour la pérénité des données sauvegardées un fichier doit contenir la valeur "humaine" vraie/fausse/indéterminée, ou bien Male/Femelle etc ...

    Charge après au logiciel qui lit les données de dire
    si Male alors NSOnstate
    sinon NSOffState

    C'est la seule façon de s'affranchir véritablement de la valeur possiblement changeante un jour de NSOnState en respectant les données réelles manipulées par le soft.


    En l'occurence, le format de données ne m'appartient pas, car je souhaite modifier une valeur d'interface d'une application tierce.
    Cela dit, l'évocation de différentes possibilités est instructive. Et, de fait, il semble plus pérenne d'utiliser des valeurs proches de la réalité de l'utilisateur.
Connectez-vous ou Inscrivez-vous pour répondre.