web-dev-qa-db-ja.com

既存の値を上書きせずにNSUserDefaultsを使用してユーザーデフォルトを登録する方法は?

いくつかのデフォルトを登録するために使用する+(void)initializeメソッドを含むAppDelegateクラスがあります。これが私が使用するコードです:

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

  [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
}

また、プリファレンスのステータスを表示するいくつかのチェックボックス(NSButton)を保持するPreferences.xibも作成しました。それらは同じキー(この場合はfooKeyとbarKey)でNSUserDefaultsControllerにバインドされます。アプリを起動して「デフォルト」を変更するたびに、次回のアプリの起動時に復元されます。

既存の値を上書きせずに「デフォルトのデフォルト」を登録する方法はありますか?アプリをビルドして起動するたびに、設定ファイルが再作成されているのでしょうか?多分私はチェックボックスをNSUserDefaultsControllerからバインド解除し、設定ウィンドウコントローラーのカスタムコードでキーの値を自分で維持する必要がありますか?

ユーザーのデフォルトを維持するための選択の実装についてお聞かせください。

Mac OS X 10.6.2とXCode 3.2.1を使用しています

33
Eimantas

-registerDefaults:のドキュメントから(強調を追加):

登録ドメインの内容はディスクに書き込まれません。 アプリケーションが起動するたびにこのメソッドを呼び出す必要があります。アプリケーションのResourcesディレクトリにplistファイルを配置し、そのファイルから読み込んだ内容でregisterDefaults:を呼び出すことができます。

だからあなたのコードは正しい軌道に乗っていました。これは、デフォルトのデフォルトを登録する方法です。

私は通常これを-applicationDidFinishLaunching:で使用します:

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

Plistを使用すると、アプリのデフォルトの追加と変更が簡単になり、@"NO"を値として誤って使用することもなくなります。

編集:Swiftバリアント:

 UserDefaults.standard.register(defaults: NSDictionary(contentsOf: Bundle.main.url(forResource: "Defaults", withExtension: "plist")!)! as! [String : Any])
75
Johan Kool