编辑:更新代码以反映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。
答案 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];