22

settings.bundleから値を設定および取得するプロジェクトを作成しました。また、 settings.bundleファイルにいくつかのデフォルト値を設定しました。問題は、値を次のように取得するときです

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
loginName.text = [defaults objectForKey:@"login_name"];

初めて null が表示されますが、値は iPhone アプリケーション設定で設定されます。値を変更するか、手動で設定すると、値が適切に取得されます。

手伝ってください

4

6 に答える 6

38

デフォルト設定を定義しても、それらは実際には値として保存されません。それらはデフォルトとして保存されます。読み取ろうとすると、値は null です。デフォルト設定は、値とは別のプロパティです。ただし、デフォルト値をデフォルトとして書き込むという意味ではありません。

私がすることは、最初に、何らかの設定(値があるはずだと確信しています)に何かが保存されているかどうかを確認することです。何もない場合は、すべてのデフォルトを書き込みます。

ここに例があります。

AppDelegate.m でemail_notificaciones_preferenceに値があるかどうかを確認し、そうでない場合は、すべてのデフォルト設定を各設定に書き込みます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    NSUserDefaults * standardUserDefaults = [NSUserDefaults standardUserDefaults];
    NSString * email_notificaciones_preference = [standardUserDefaults objectForKey:@"email_notificaciones_preference"];
    if (!email_notificaciones_preference) {
        [self registerDefaultsFromSettingsBundle];
    }

}

この関数は、各要素にデフォルトを書き込むために使用するものです。

#pragma NSUserDefaults
- (void)registerDefaultsFromSettingsBundle {
    // this function writes default settings as settings
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
    if(!settingsBundle) {
        NSLog(@"Could not find Settings.bundle");
        return;
    }

    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]];
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];

    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];
    for(NSDictionary *prefSpecification in preferences) {
        NSString *key = [prefSpecification objectForKey:@"Key"];
        if(key) {
            [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];
            NSLog(@"writing as default %@ to the key %@",[prefSpecification objectForKey:@"DefaultValue"],key);
        }
    }

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];

}

それが役立つことを願っています。

于 2013-08-25T00:37:37.127 に答える
5

誰かがそれを必要とする場合-私は答えをMIQUELからSwiftに翻訳しました(私がまだ学んでいる限り):

var standardUserDefaults = NSUserDefaults.standardUserDefaults()
var us: AnyObject? = standardUserDefaults.objectForKey("your_preference")
if us==nil {
    self.registerDefaultsFromSettingsBundle();
}

そして func registerDefaultsFromSettingsBundle:

func registerDefaultsFromSettingsBundle() {
    // this function writes default settings as settings
    var settingsBundle = NSBundle.mainBundle().pathForResource("Settings", ofType: "bundle")
    if settingsBundle == nil {
        NSLog("Could not find Settings.bundle");
        return
    }
    var settings = NSDictionary(contentsOfFile:settingsBundle!.stringByAppendingPathComponent("Root.plist"))!
    var preferences: [NSDictionary] = settings.objectForKey("PreferenceSpecifiers") as [NSDictionary];
    var defaultsToRegister = NSMutableDictionary(capacity:(preferences.count));

    for prefSpecification:NSDictionary in preferences {
        var key: NSCopying? = prefSpecification.objectForKey("Key") as NSCopying?
        if key != nil {
            defaultsToRegister.setObject(prefSpecification.objectForKey("DefaultValue")!, forKey: key!)
        }
    }
    NSUserDefaults.standardUserDefaults().registerDefaults(defaultsToRegister);  
}
于 2015-02-22T15:47:22.563 に答える