2010-11-03 5 views
1

J'ai une application qui a été écrit sous OS 3.x - il a bien fonctionné à l'époque. Depuis la reconstruction pour OS 4.1, il ne fonctionne plus en ce qui concerne le chargement des paramètres de l'application. J'ai un fichier 'root.plist' fourni avec l'application.NSUserDefaults ne charge pas dans IOS4

Certains des paramètres par défaut y sont déjà définis en éditant le fichier, c'est-à-dire le nom d'hôte, le délai d'expiration, etc. Un nouvel utilisateur doit fournir certaines informations de connexion, celles-ci sont donc laissées vides. Lorsque l'application démarre pour la première fois, elle détecte les informations d'identification manquantes et se ferme, demandant à l'utilisateur d'accéder aux paramètres et d'entrer ses informations d'identification. Si j'ouvre les paramètres, je vois ce que j'attends; un nom d'hôte, un délai d'expiration et d'autres paramètres par défaut tels qu'ils étaient dans root.plist. J'entre le nom d'utilisateur et mot de passe, plus un autre code d'identification. Lorsque je redémarre l'application, je récupère des valeurs pour les données que je viens de saisir, plus le BOOL protocolswitch = YES (que je n'ai pas changé). Les autres valeurs retournent toutes à zéro, bien qu'elles apparaissent dans les paramètres.

username = [[NSUserDefaults standardUserDefaults] stringForKey:@"name_preference"]; 
password = [[NSUserDefaults standardUserDefaults] stringForKey:@"password_preference"]; 
CRMID  = [[[[NSUserDefaults standardUserDefaults] stringForKey:@"userID_preference"]uppercaseString] retain]; 
hostname = [[NSUserDefaults standardUserDefaults] stringForKey:@"hostname_preference"]; 
protocolSwitch = [[NSUserDefaults standardUserDefaults] boolForKey:@"http_preference"]; 
timeout = [[NSUserDefaults standardUserDefaults] doubleForKey:@"timeout_preference"]; 
portNumber = [[NSUserDefaults standardUserDefaults] integerForKey:@"port_preference"]; 
bccEmail = [[NSUserDefaults standardUserDefaults] stringForKey:@"bcc_email_preference"]; 
locationOn = [[NSUserDefaults standardUserDefaults] boolForKey:@"location_preference"]; 

Je sais « Synchronize » mais je ne suis pas réellement changer ces valeurs à l'intérieur de mon application, donc je ne vois pas comment cela s'applique ici. J'ai également vérifié que l'application ne fonctionne pas en arrière-plan avant de redémarrer, cela ne fait aucune différence. Cela fonctionnait parfaitement avant OS4, est-ce que quelqu'un comprend le changement de comportement? Un moyen de le réparer? Cheers,

Sarge62.

Il y a définitivement quelque chose qui ne va pas dans le résultat des réglages. Après avoir pratiqué le dumping des clés du dictionnaire à la console lorsque l'application lance, je vois ceci:

"location_preference", 
NSInterfaceStyle, 
AppleLanguages, 
"userID_preference", 
AppleKeyboardsExpanded, 
AppleLocale, 
AppleKeyboards, 
NSLanguages, 
"http_preference", 
"password_preference", 
"name_preference" 

Il y a seulement cinq des clés définies dans le plist! Si je vais dans les paramètres et change le nom d'hôte en autre chose que ce qui était dans le plist par défaut, il apparaîtra dans le journal ci-dessus. Il semble qu'il y ait un bug (?) Dans l'écran Paramètres qui enregistre uniquement les clés qui sont modifiées par rapport à la valeur par défaut initiale (pour les objets de chaîne au moins, BOOLS sont OK).

+0

est arrivé à moi aussi, a commencé à tomber aux valeurs par défaut « préemballé » dictionnaire lorsque nul est rencontré – slf

+1

vient de présenter une pièce d'identité Bug # 9908757 ce sujet – slf

Répondre

1

Avez-vous enregistré les valeurs par défaut? Cela se fait généralement dans une méthode de classe + (void) initialize du délégué de l'application.

par exemple

+ (void)initialize { 
NSMutableDictionary *defaultValues = [NSMutableDictionary dictionary]; 
[defaultValues setObject:@"defaultHostname" forKey:@"hostname"]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues]; 
} 
+0

Merci Gorilla, mais je ne Je pense que c'est ça. Je sais ce que vous voulez dire - j'ai un autre code dans une application 4.1 qui le fait - il lit le fichier root.plist et écrit le contenu de ce dictionnaire s'il détermine que les valeurs par défaut n'existent pas. – Sarge62

+0

ThinK J'ai trouvé la cause - voir le post édité. – Sarge62

+0

Pas si sûr si il se comporte bizarre. À ma connaissance, NSUserDefaults enregistre uniquement les préférences qui sont différentes des valeurs par défaut que vous avez enregistrées. Cela conviendrait aussi à votre observation. – GorillaPatch