web-dev-qa-db-ja.com

-[NSUserDefaults registerDefaults:]の使用法は何ですか?

違いは何ですか:

[[NSUserDefaults standardUserDefaults] registerDefaults:
  [NSDictionary dictionaryWithObjectAndKey:anObject, @"something"]];

この:

[[NSUserDefaults standardUserDefaults] setObject:anObject forKey:@"something"];
65
Enrico Susatyo

違いは、ユーザーが「プロパティ」に変更を加えなかったときに使用されるデフォルトの最初のコードスニペットが使用されることです。

したがって、「Welcome message」というキー名の「プロパティ」を提供したい場合は、nilを返すプロパティに代わりに、デフォルトのメッセージ「Welcome first-time user」が挿入されます。プロパティの変更。

「プロパティ」がnilを返すかどうかを確認するためにifテストを書く必要がなく、そうであれば別のメッセージを作成する必要がないため、これによりロジックが簡素化されます。

NSString *greeting = [[NSUserDefaults standardUserDefaults] stringForKey:@"Greeting"];

if(greeting == nil) {
    NSLog(@"Welcome first-time user!");
}

投稿した2番目のコードスニペットは、プロパティを別の値に設定するためのものです。 Userdefaultsのプログラムの状態に応じて値を設定するためのさまざまなsetメソッド(setString、setObject、setBoolean)があります。

編集-----コメントで要求されたとおりに更新します。

最初の方法は、名前が示すとおり、値をデフォルトに登録するためのものです。何らかのキー名でプロパティに初めてアクセスすると、値はオブジェクトの場合はnil、ブール値の場合はfalse、数値の場合は0になります。プログラムで値が設定されていない場合に多くのテストなどを行う代わりに、上記の例のような「デフォルト」アクションを実行すると、これらのキーに対して事前定義された値を使用してアプリケーションを出荷できます。

RegisterDefaultsを配置する一般的な場所は、appDelegateのinitializer-methodです。

次に、プログラムのどこかでこれらのフィールドの値を設定し、setObject、setString、setBoolean ...を使用し、取得にはstringForKey、objectForKey ...を使用します。

これと考えてください

RegisterDefaultsは、オブジェクトに適切な値を提供できるコンストラクターです。それ以外の場合は、既に記述したデフォルトを取得します。その後、オブジェクトの属性を変更する場合は、「コンストラクタ」ではなくset/getメソッドを使用します。

82
LuckyLuke

簡単に言えば、

[[NSUserDefaults standardUserDefaults] setObject:@"Entropy" forKey:@"kName"]

library/Preferenceフォルダーのcom.example.Demo.plistという名前のファイルに「エントロピー」を保存します(com.example.DemoはバンドルIDです。 IOS Application Security Part 20 – Local Data Storage を参照してください) )

[[NSUserDefaults standardUserDefaults] setObject:@"Mac OS X" forKey:@"kOS"];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                @"Windows", @"kOS",
                                @"Google", @"kSearchEngine", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kOS"]);
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kSearchEngine"]);
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kBrowser"]);

印刷「Mac OS X」、「Google」、(null)

実際、registerDefaults

  • ディスクに保存しません
  • 設定されていないキーの値のみを設定します(「kOS」はsetObject:forKey:によって設定され、「kSearchEngine」は設定されません)
  • スカラー値の場合は0、オブジェクトの場合はregisterDefaultssetObject:forKey:の両方でキーが設定されていない場合はnilを返します(この場合は「kBrowser」)

registerDefaultsの使用

Preferences and Settings Programming Guide から引用

これらの標準のデフォルト値がアプリに適さない場合、registerDefaults:メソッドを使用して独自のデフォルト値を登録できます。このメソッドは、カスタムのデフォルト値をNSRegistrationDomainドメインに配置します。これにより、プリファレンスが明示的に設定されていない場合に返されます。

NSUserDefaultsでデータを保存する方法 から引用

別のヒントは、事前定義されたNSDictionaryオブジェクトでNSUserDefaultsを初期化できることです。そのため、たとえば、ユーザーがプログラムを操作する前にデフォルト値を「false」または「true」に設定できます。私の場合、ゲーム内のすべてのレベルを表す配列を作成し、各配列値にブール値を保存して、プレーヤーがレベルを終了したかどうかを確認することがあります。これを行うには、データオブジェクトを作成し、NSUserDefaultsに登録します。オブジェクトに以前の値が存在する場合、何も起こりません。それ以外の場合、空のオブジェクトは「デフォルト」のデフォルトとして保存されます

PS:Oleには、 NSUserDefaultsによるデフォルト値の処理 の詳細を説明する非常に優れた記事があります。

31
onmyway133

別の見方はこれです。 〜/ Library/Preferencesから設定ファイルを削除すると、registerDefaultsによって設定されるデフォルトは、新しい設定が設定されるまでアプリケーションに適用されるものになります。

10
Abizern

In Swift 2.1.1 Xcode 7.2

このスニペットをapplication:didFinishLaunchingWithOptionsに追加して、ユーザーがアプリで変更できるパラメーターの1つであるtintColorsIndexを初期化します。

    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.registerDefaults([
        "tintColorsIndex" : -1,
        ])

アプリが初めて起動されたとき、tintColorsIndexには-1(Int)の値が割り当てられます。ユーザーがアプリの使用中に色を変更した場合、その後の起動時にユーザーの設定が上書きされることはありません。

3
Jervisbay

ユーザーのデフォルトはドメインにグループ化されます... registerDefaultsは、登録ドメインにデフォルトを追加するために使用されます。

環境設定およびプログラミングガイド でドメインについて読むことができます。

1
Swapnil Luktuke