NSUserDefaults无法在应用程序关闭/启动时保持不变

时间:2012-03-17 13:58:03

标签: objective-c ios nsuserdefaults

编辑:更新代码以反映Paul.s的建议。

过去一周一直在搜索SO,但仍无法让我的应用程序在Sim和Device中关闭/重新启动应用程序时,在应用程序内保留更改设置。

尝试使用Singleton中的NSMutableDictionary,但我认为这不是问题。

a)使用AppDelegate的applicationDidFinishLaunchingWithOptions中的registerDefaults为应用设置初始默认值:

AppManager *global = [AppManager sharedInstance];


// set up the defaults.
global.gWantFoo = YES;    // This is a BOOL which relates to a UISwitch

// #define kWantFoo @"gWantFoo"
global.globalSettingsDict = [[NSMutableDictionary alloc] 
                               initWithObjectsAndKeys: 
                               [NSNumber numberWithBool:global.gWantFoo], kWantFoo, nil];

global.globalSettings = [NSUserDefaults standardUserDefaults];
[global.globalSettings registerDefaults:global.globalSettingsDict];
[global.globalSettings synchronize];

b)在我能够设置开关的ConfigView中,我有一个选择器在开关更换时执行以下操作。

self.global.gWantFoo = NOT(self.global.gWantFoo);   // #define NOT(a)  !(a)
[self.global.globalSettings setBool:self.global.gWantFoo forKey:kWantFoo];
[self.global.globalSettings synchronize];

c)我在applicationDidEnterBackground和朋友中有一个同步,虽然切换值确实在应用程序实例的生命周期内保持更改,但一旦我重新启动,gWantFoo将被默认的“YES”覆盖。

任何建议表示赞赏。我正濒临破产,因为我紧挨着诅咒诅咒我的病人。好的,我对这个编辑更平静。我想轻轻摇晃macbook pro来证明我对NSUserDefaults不太满意: - )

干杯

SC。

2 个答案:

答案 0 :(得分:3)

所以从开始到结束,这就是你需要做什么/应该发生什么

application:didFinishLaunchingWithOptions:中,您要做的第一件事就是注册默认值:

NSDictionary *defaultsDefaults = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:NO] , PSWantFoo, nil];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:defaultsDefaults];

注意:PSWantFoo定义为NSString * const PSWantFoo = @"PSWantFoo";,所以我没有遍布各处的字符串文字。

此时如果应用从未运行NSLog(@"%d", [defaults boolForKey:PSWantFoo]);,则会打印0

现在,当我想设置值时,我会使用以下内容:

[defaults setBool:YES forKey:PSWantFoo];
[defaults synchronize];

现在,当我运行NSLog(@"%d", [defaults boolForKey:PSWantFoo]);时,它会打印1

至于此时的持久性,因为我实际设定了一个值,在

为我创建了一个plist
<path to app>/Library/Preferences/<bundle identifier>.plist

如果您检查此文件,您将看到类似

的内容
<?xml version="1.0" encoding="UTF-8"?>
<DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PSWantFoo</key>
    <true/>
</dict>
</plist>

现在从这一点开始,将读取此值而不是registerDefaults:

中注册的值

更新

为什么要按此顺序硬编码?

// set up the defaults.
global.gWantFoo = YES;    // This is a BOOL which relates to a UISwitch

为什么不反过来呢?

使用默认值YES;

注册默认值
NSDictionary *defaultsDefaults = [[NSDictionary alloc] initWithObjectsAndKeys: 
                                   [NSNumber numberWithBool:YES], kWantFoo, nil];

[defaults registerDefaults:defaultsDefaults];

然后你得到设置

global.gWantFoo = [defaults boolForKey:kWantFoo];

这样,如果应用尚未设置首选项,则答案为YES,否则它将是应用之前设置的内容。

答案 1 :(得分:0)

在保存默认值后,您应该设置标志@“gSettingsAreSet”

[[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"gSettingsAreSet"];
[[NSUserDefaults standardUserDefaults] synchronize];