2010-09-12 8 views
3

Essayer par programmation de faire ce que la commande 'defaults write' fait dans OS X. Je n'arrive pas à comprendre comment obtenir le bon dictionnaire de préférences pour le domaine que je cherche. Je peux obtenir quelques préférences pour les domaines dans le code ci-dessous, mais les préférences en question ne semblent pas être dans le dict. Pourquoi/comment sont-ils dans la commande du terminal mais pas dans le code?Equivalent programmatique de la commande "defaults write", par exemple, comment utiliser NSUserDefaults?

Ne sont-ils pas dans les valeurs par défaut standard de l'utilisateur? Juste ne peut pas sembler les trouver.

Edit: ce sont les commandes que je tente de mettre en code:

defaults write com.apple.dock mcx-expose-disabled -bool true 
defaults write com.apple.dashboard mcx-disabled -bool true 




NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

NSMutableDictionary *dockDict = [[defaults persistentDomainForName:@"com.apple.dock"] mutableCopy]; 
NSMutableDictionary *dashDict = [[defaults persistentDomainForName:@"com.apple.dashboard"] mutableCopy]; 

[dockDict setValue:YES forKey:@"mcx-expose-disabled"]; 


[defaults setPersistentDomain:dockDict forName:@"com.apple.dock"]; 
[defaults setPersistentDomain:dashDict forName:@"com.apple.dashboard"]; 
+0

Pourquoi ne pas vous montrer exactement ce que commande 'par défaut write' vous voulez un équivalent? – JWWalker

+0

modifié pour répondre à vos questions. – RibaldEddie

Répondre

2

Le seul problème est votre ligne ici:

[dockDict setValue:YES forKey:@"mcx-expose-disabled"]; 

Cela devrait être

[dockDict setValue:[NSNumber numberWithBool:YES] forKey:@"mcx-expose-disabled"]; 

Objective-C n'autorise pas automatiquement les valeurs des types primitifs dans les objets. Et, le compilateur aurait dû vous donner un avertissement disant que vous ne pouvez pas passer YES à setValue:forKey:. Vous devriez inspecter tous les avertissements que le compilateur émet! C'est ce que les avertissements sont pour!

+0

Merci, je n'ai pas encore exécuté ce code avec la ligne setValue, jusqu'ici je l'ai seulement exécuté avec des appels NSLog() pour voir ce qui est dans Dictionary. – RibaldEddie

5

Il pourrait être plus facile à utiliser Core Foundation pour cela, par exemple,

CFPreferencesSetAppValue(CFSTR("mcx-expose-disabled"), kCFBooleanTrue, CFSTR("com.apple.dock")); 
CFPreferencesAppSynchronize(CFSTR("com.apple.dock")); 
+1

Merci, c'est beaucoup plus facile en termes de code que je dois écrire, mais j'ai marqué l'autre réponse comme réponse acceptée car a) Yuji posté en premier et b) techniquement ma question portait sur l'API Objective-C et non API C Mais si j'avais su à propos de l'API CF que vous mentionnez, je l'aurais peut-être fait. – RibaldEddie