34

我有一个 AppDelegate 类,其中包含+(void)initialize用于注册一些默认值的方法。这是我使用的代码:

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

  [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
}

我还创建了 Preferences.xib,其中包含几个NSButton显示首选项状态的复选框 ( )。它们绑定到NSUserDefaultsController相同的键(本例中为 fooKey 和 barKey)。每次我启动应用程序并更改“默认值”时,它们都会在下一次应用程序启动时恢复。

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

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

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

4

1 回答 1

75

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

注册域的内容不写入磁盘;您需要在每次应用程序启动时调用此方法。您可以在应用程序的 Resources 目录中放置一个 plist 文件,然后使用从该文件中读取的内容调用 registerDefaults:。

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

我通常在-applicationDidFinishLaunching:

// Load default defaults
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]];

使用 plist 可以很容易地在你的应用中添加和更改默认值,并且它也可以防止你错误地使用@"NO"作为一个值。

编辑:Swift 3变体:

 UserDefaults.standard.register(defaults: NSDictionary(contentsOf: Bundle.main.url(forResource: "Defaults", withExtension: "plist")!)! as! [String : Any])
于 2010-01-16T19:24:59.367 回答