如何在不覆盖现有值的情况下使用NSUserDefaults注册用户默认值?

Eim*_*tas 33 cocoa nsuserdefaults user-preferences

我有一个AppDelegate类+(void)initialize,我用它来注册一些默认值.这是我使用的代码:

+ (void)initialize {
  NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys:@"NO", @"fooKey", @"YES", @"barKey", nil];

  [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
}
Run Code Online (Sandbox Code Playgroud)

我还创建了Preferences.xib,它包含几个NSButton显示首选项状态的复选框().它们NSUserDefaultsController与相同的键绑定(在这种情况下为fooKey和barKey).每次我启动应用程序并更改"默认值"时,它们都会在下次应用程序启动时恢复.

有没有办法在不覆盖现有值的情况下注册"默认默认值"?也许每次我构建并启动一个应用程序时,它的首选项文件正在重新创建?也许我应该从NSUserDefaultsController首选项窗口控制器中的一些自定义代码中取消绑定复选框并维护键的值?

我想听听您为维护用户默认值而选择的实现.

我正在使用Mac OS X 10.6.2和XCode 3.2.1

Joh*_*ool 75

-registerDefaults:(重点添加)的文档:

注册域的内容不会写入磁盘; 每次应用程序启动时都需要调用此方法.您可以将plist文件放在应用程序的Resources目录中,并使用从该文件读入的内容调用registerDefaults:.

所以你的代码是在正确的轨道上.这是您注册默认默认值的方式.

我通常用这个-applicationDidFinishLaunching::

// Load default defaults
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]];
Run Code Online (Sandbox Code Playgroud)

使用plist可以轻松添加和更改应用程序中的默认值,并且可以防止您将错误@"NO"用作值.

编辑:Swift 3变种:

 UserDefaults.standard.register(defaults: NSDictionary(contentsOf: Bundle.main.url(forResource: "Defaults", withExtension: "plist")!)! as! [String : Any])
Run Code Online (Sandbox Code Playgroud)

  • 出于某种原因,当我在-applicationWillFinishLaunching中进行此操作时,它不起作用.只需将其移至-applicationDidFinishLaunching即可.奇怪的. (2认同)