我在我的 Settings.bundle 中保存了一些设置,我尝试application:didFinishLaunchingWithOptions
在nil
. 一旦我进入设置屏幕然后退出,它们在之后的每次运行中都能正常工作。
这是怎么回事?在 Settings.bundle 中使用默认值不是为了能够使用它们而无需用户先输入它们吗?
我在我的 Settings.bundle 中保存了一些设置,我尝试application:didFinishLaunchingWithOptions
在nil
. 一旦我进入设置屏幕然后退出,它们在之后的每次运行中都能正常工作。
这是怎么回事?在 Settings.bundle 中使用默认值不是为了能够使用它们而无需用户先输入它们吗?
如果我的问题正确,请在您的应用程序委托的 - (void)applicationDidFinishLaunching:(UIApplication *)application 中,通过调用 [NSUserDefaults standardUserDefaults] 上的 registerDefaults:dictionaryWithYourDefaultValues 来设置您的设置的默认值
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:3], @"SomeSettingKey",
@"Some string value", @"SomeOtherSettingKey",
nil];
[ud registerDefaults:dict];
}
仅当您的应用程序的先前执行未设置或更改这些设置时,才会使用这些值。
正如 coneybeare 所说:“您应该检测它是否是第一次加载,然后最初存储所有默认值。”
在 applicationDidFinishLaunching 尝试在您的偏好中设置默认值。
这是示例:
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
if([defaults objectForKey:@"YOUR_KEY"] == nil)
{
[defaults setValue:@"KEY_VALUE" forKey:@"YOUR_KEY"];
}
当应用程序第二次运行时,它会为 YOUR_KEY 提供 KEY_VALUE。
谢谢,
吉姆。
在 Settings.bundle 中使用默认值不是为了能够使用它们而无需用户先输入它们吗?
不,设置捆绑包的目的是为用户提供一个在方便的地方编辑所有 3rd 方应用程序设置的地方。这种集中化是否真的是一个好主意是一个离题的用户体验问题。
要回答您的问题,您应该检测它是否是第一次加载,然后最初存储所有默认值。
当我们讨论这个主题时,我还会查看应用程序设置工具包,因为它为您的应用程序提供了一种简单的方法,可以用最少的代码在两个地方(应用程序内和 Settings.app)显示您的应用程序设置。
Settings.bundle 中的值旨在让“设置”应用能够为您的应用填写默认值。您自己的应用程序不使用它们。但是您可以使用 NSUserDefaults 的 registerDefaults: 方法自己设置默认值。这实际上不会在磁盘上设置它们,而只是给出“默认值的默认值”:当用户尚未设置任何值时使用它们。
设置 registerDefaults:必须在使用任何默认值之前完成。其他人为此建议的“applicationDidFinishLaunching:”方法在大多数情况下为时已晚。在调用“applicationDidFinishLaunching:”时,您的视图已经从 nib 文件中加载,并且它们的“viewDidLoad:”方法已被调用。他们通常可能会读取用户默认值。
为了保证在第一次使用之前设置默认值,我使用以下实用程序类,它从 Root.plist 文件加载值并使用“registerDefaults:”设置它们。您使用此类来读取用户默认值,而不是“[NSUserDefaults standardUserDefaults]”。请改用“[设置获取]”。
作为奖励,它还包含用户默认更改通知的注册方法,因为我总是忘记这是如何完成的。
#import "Settings.h"
@implementation Settings
static bool initialized = NO;
+ (void) setDefaults
{
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
NSString *settingsBundlePath = [bundlePath stringByAppendingPathComponent:@"Settings.bundle"];
NSBundle *settingsBundle = [NSBundle bundleWithPath:settingsBundlePath];
NSString *settingsPath = [settingsBundle pathForResource:@"Root" ofType:@"plist"];
NSDictionary *settingsDict = [NSDictionary dictionaryWithContentsOfFile:settingsPath];
NSArray *prefSpecifierArray = [settingsDict objectForKey:@"PreferenceSpecifiers"];
NSMutableDictionary *appDefaults = [[NSMutableDictionary alloc] init];
for (NSDictionary *prefItem in prefSpecifierArray)
{
NSString *key = [prefItem objectForKey:@"Key"];
if (key != nil) {
id defaultValue = [prefItem objectForKey:@"DefaultValue"];
[appDefaults setObject:defaultValue forKey:key];
}
}
// set them in the standard user defaults
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
if (![[NSUserDefaults standardUserDefaults] synchronize]) {
NSLog(@"Settings setDefaults: Unsuccessful in writing the default settings");
}
}
+ (NSUserDefaults *)get
{
if (!initialized) {
[Settings setDefaults];
initialized = YES;
}
return [NSUserDefaults standardUserDefaults];
}
+ (void) registerForChange:(id)observer selector:(SEL)method
{
[[NSNotificationCenter defaultCenter] addObserver:observer selector:method name:NSUserDefaultsDidChangeNotification object:nil];
}
+ (void) unregisterForChange:(id)observer
{
[[NSNotificationCenter defaultCenter] removeObserver:observer name:NSUserDefaultsDidChangeNotification object:nil];
}