代码之家  ›  专栏  ›  技术社区  ›  Ben Collins

在模拟器上首次运行时不存在nsuserdefaults

  •  4
  • Ben Collins  · 技术社区  · 16 年前

    我的settings.bundle中保存了一些设置,并尝试在 application:didFinishLaunchingWithOptions ,但在模拟器上首次运行时,按键访问对象始终返回 nil (如果是整数,则为0)。一旦我进入设置屏幕,然后退出,以后每次跑步它们都会正常工作。

    发生什么事?在settings.bundle中使用默认值是否意味着无需用户先输入即可使用这些值?

    4 回复  |  直到 13 年前
        1
  •  5
  •   user362178    16 年前

    如果您的问题正确,请在应用程序委托的-(void)applicationDidFinishLaunching:(uiapplication*)应用程序中,通过调用 寄存器默认值:字典具有默认值 打开[nsuserdefaults standarduserdefaults]

    - (void)applicationDidFinishLaunching:(UIApplication *)application {    
        NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithInt:3], @"SomeSettingKey",
                              @"Some string value", @"SomeOtherSettingKey",
                              nil];
        [ud registerDefaults:dict];
    }
    

    只有在应用程序以前的执行没有设置或更改这些设置时,才会使用这些值。

        2
  •  3
  •   Jim    16 年前

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

    在applicationDidFinishingLaunching中,尝试在首选项中设置默认值。

    这是样品:

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

    当应用程序第二次运行时,它将为您的\键提供键值。

    谢谢,
    吉姆。

        3
  •  2
  •   coneybeare    16 年前

    使用默认值不是重点吗 settings.bundle中的值 能够使用它们而不需要 用户先输入?

    不需要。设置包的要点是给用户一个在方便的地方编辑所有第三方应用程序设置的地方。这种集中化是否真的是一个好主意,这是一个主题之外的用户体验问题。

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

    当我们讨论这个问题时,我也会检查一下 In App Settings Kit 因为它为你的应用程序提供了一种简单的方法,可以用最少的代码在两个地方(在app和settings.app中)显示你的应用程序设置。

        4
  •  2
  •   fishinear curtisk    15 年前

    settings.bundle中的值用于设置应用程序,以便能够填写应用程序的默认值。它们不会被你自己的应用程序使用。 但是您可以使用registerDefaults自己设置默认值:nsUserDefaults方法。这实际上不会在磁盘上设置它们,只会给出“默认值”:当用户尚未设置任何值时使用它们。

    设置registerdefaults:必须在使用默认值之前完成。其他人为此建议的“applicationDidFinishLaunching:”方法在大多数情况下都太晚了。当调用“applicationDidFinishLaunching:”时,您的视图已经从NIB文件加载,并且调用了它们的“viewDidLoad:”方法。它们通常可以读取用户默认值。

    为了确保在第一次使用之前设置默认值,我使用以下实用程序类,它从root.plist文件加载值并使用“registerdefaults:”设置值。您可以使用这个类来读取用户默认值,而不是“[nSurrDebug StaldUrServEdvult]”。使用“[设置获取]”代替。

    另外,它还包含一个用户默认更改通知的注册方法,因为我总是忘记这是如何完成的。

    #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];
    }