デフォルト値の設定

アプリケーションを最初に起動したときは、ユーザーが設定した値(ユーザーデフォルト)というものは当然ながらありません。そのときに読み出される値が不定値では困りますから、デフォルトの値(アプリケーションデフォルト)を設定する必要があります。この事は"User Defaults"というドキュメントの"Using Defaults - Set a default in the NSRegistrationDomain"に書いてあります。

To register the application’s default behavior, you get the application's shared instance of NSUserDefaults and register default values with it. A good place to do this is in the initialize method of the class that uses the default. The following example registers the value “YES” for the default named “DeleteBackup”.


+ (void)initialize{
 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSDictionary *appDefaults = [NSDictionary
        dictionaryWithObject:@"YES" forKey:@"DeleteBackup"];
 
    [defaults registerDefaults:appDefaults];
}

The initialize message is sent to each class before it receives any other message, ensuring that the application's defaults are set before the application needs to read them.

これを読むと

という事がわかります。デフォルトデータベースを使用するクラスはRandomizerなので、ここのinitializeメソッドで設定する事にします。

またサンプルでは辞書の中身をソースコードで設定していますが、数が多いとこれでは大変です。NSDictionaryにはdictionaryWithContentsOfFile:というクラスメソッドがあって、ファイルを読んで辞書を生成する事ができますので、これを使います。

辞書の中身を記述したUserDefaults.plistというファイルをResourcesフォルダの中に作ります。

userDefaultsPlist

NSBundleクラスのpathForResource:ofType:メソッドを使うと、このファイルのパスを得る事ができますので、得られたパスをdictionaryWithContentsOfFile:に渡してやればOKです。したがって、initializeメソッドの実装は以下の様になります。

Randomizer.m
+ (void)initialize
{
    NSString        *userDefaultsValuesPath;
    NSDictionary    *userDefaultsValuesDict;
    
    userDefaultsValuesPath = 
        [[NSBundle mainBundle] pathForResource:@"UserDefaults" 
                                        ofType:@"plist"];
    userDefaultsValuesDict = 
        [NSDictionary
            dictionaryWithContentsOfFile:userDefaultsValuesPath];
    
    [[NSUserDefaults standardUserDefaults]
        registerDefaults:userDefaultsValuesDict];
}

次にUserDefaults.plistの作り方を説明します。



amazon.co.jpの広告