Laisser au Framework le soin de gérer les préférences

Un fichier de préférences d'une application est un fichier sis dans le dossier ~/Library/Preferences. Il porte un nom de la forme com.application.plist et vous pouvez l'ouvrir avec Property List Editor. Mais en fait, il s'agit d'un fichier au format XML comme bon nombre de fichiers systèmes de MAC OS X.

Depuis Panther, xCode permet d'utiliser un technique très sophistiquée pour vous décharger des tâches de gestion des préférences : le BINDING

Grâce à cette technique, la valeur ou une propriété d'un objet peut être automatiquement reliée à une entrée du fichier des préférences.

Commencez par ajouter cette icône à votre fichier d'interface : faites glisser l'icône de la palette vers la fenêtre du fichier application.nib

Pasted Graphic

Ensuite, sélectionnez le contrôle dont vous voulez contrôler la valeur, par exemple, puis afficher la fenêtre d'informations. Dans le menu déroulant en haut, sélectionnez "Bindings". La fenêtre adapte le contenu à ce que vous voulez faire et vous présente les propriétés de l'objet que vous pouvez lier à une entrée du fichier de préférences; parmi ces propriétés, vous avez "value" qui représente sa valeur :

- contenu d'une zone de texte
- valeur d'une case à cocher
- etc...

Déroulez "value" et remplissez les zones comme indiqué ci-dessous :

- Bind to : choisissez "Shared User Defaults"
- Controller Key : values, pas le choix
- Model Key Path : le nom de la variable dans le fichier des préférences

Pasted Graphic 1

Dès lors, chaque fois que vous modifierez la valeur du contrôle, elle ira s'inscrire dans le fichier des préférences de votre application sans écrire une seule ligne de code.

Maintenant, si vous voulez utiliser cette valeur dans le programme, il est inutile d'écrire une méthode compliquée pour relire le contenu du fichier. Il suffit de faire comme suit (exemple pour lire l'état d'une case à cocher) :

    // Déclaration du fichier des préférences
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    // ...
    BOOL bCase = ([defaults integerForKey:@"uneCase"]==NSOnState);