4

我在我的 Settings.bundle 中保存了一些设置,我尝试application:didFinishLaunchingWithOptionsnil. 一旦我进入设置屏幕然后退出,它们在之后的每次运行中都能正常工作。

这是怎么回事?在 Settings.bundle 中使用默认值不是为了能够使用它们而无需用户先输入它们吗?

4

4 回答 4

5

如果我的问题正确,请在您的应用程序委托的 - (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];
}

仅当您的应用程序的先前执行未设置或更改这些设置时,才会使用这些值。

于 2010-06-15T12:30:44.183 回答
3

正如 coneybeare 所说:“您应该检测它是否是第一次加载,然后最初存储所有默认值。”

在 applicationDidFinishLaunching 尝试在您的偏好中设置默认值。

这是示例:

NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
if([defaults objectForKey:@"YOUR_KEY"] == nil)
{
    [defaults setValue:@"KEY_VALUE" forKey:@"YOUR_KEY"];
}

当应用程序第二次运行时,它会为 YOUR_KEY 提供 KEY_VALUE。

谢谢,
吉姆。

于 2010-05-08T05:32:10.263 回答
2

在 Settings.bundle 中使用默认值不是为了能够使用它们而无需用户先输入它们吗?

不,设置捆绑包的目的是为用户提供一个在方便的地方编辑所有 3rd 方应用程序设置的地方。这种集中化是否真的是一个好主意是一个离题的用户体验问题。

要回答您的问题,您应该检测它是否是第一次加载,然后最初存储所有默认值。

当我们讨论这个主题时,我还会查看应用程序设置工具包,因为它为您的应用程序提供了一种简单的方法,可以用最少的代码在两个地方(应用程序内和 Settings.app)显示您的应用程序设置。

于 2010-05-08T04:45:49.623 回答
2

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];
}
于 2011-09-02T08:41:28.687 回答