2011-01-30 214 views
4

我刚开始使用偏好设置窗格让用户自定义iOS应用程序中的某些设置,创建Settings.bundle并从中访问信息非常简单。我的问题是我在苹果文档阅读的设置应编程初始化:初始化iPhone应用程序默认值的位置

建议你除了程序在启动时注册所有默认的值,包括他们在您的设置绑定属性列表。对于新安装的应用程序,在设置应用程序运行之前,应用程序设置包中的默认首选项值不会被设置。这意味着如果用户在运行设置前运行应用程序,则设置包中指定的默认值将不可用。 在启动时以编程方式设置这些值可确保您的应用程序始终具有适当的值。要以编程方式注册默认值,请使用NSUserDefaults类的registerDefaults:方法。

在应用程序中的哪里进行了初始化,我怎样才能确定我不覆盖用户提供的值?这是用App Delegate的某种方法处理的吗?

回答

11

在尝试访问存储在NSUserDefaults中的值之前,您应该注册默认值。 你可以在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
注册您的默认值很快,所以不需要优化。只需在应用程序启动时执行此操作即可。

我存储我的userdefaults在plist中并注册该列表的内容,就像这样:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserDefaults" ofType:@"plist"]]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; 

如果您注册默认这样你就不必担心您覆盖用户提供的值。 NSUserdefaults使用“域”来存储它的值。如果您注册了默认值,它们将存储在注册域中。如果用户存储值,则这些值将存储在应用程序域中。

如果您尝试从NSUserdefaults中获取值,它会查看该值是否存在于应用程序域中,如果不存在,则会从注册域获取该值。


编辑:

plist editor

(如果没有用户提供的值或者更好的,存储在您的NSUserDefaults的价值观,以及那些作为后备),您会访问那些值一样这个:

NSInteger minutesToWait = [[NSUserDefaults standardUserDefaults] integerForKey:@"MinutesToWait"; 
NSString *urlString = [[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultURLStr"]; 

plist只是NSDictionary的键和值的另一种表示。关键是您用于访问userdefaults的键,并且该值是您的默认值。 非常直截了当。
你如何创建词典并不重要。你也可以在代码中做到这一点。

+0

所以会说的plist是什么样子?只是一组与关联名称关联的键/值对?如果代码位于` - (void)applicationDidFinishLaunching:(UIApplication *)application`中,还是必须位于` - (BOOL)应用程序中:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions` for一些原因? – 2011-01-31 19:34:16

0

您可以用同样的方法应用程序委托里面,你用它来设置你的初始窗口,didFinishLaunchingWithOptions:

但是,您可能还需要内部applicationWillEnterForeground一些逻辑:,因为潜在的用户可以把你的应用程序进入背景,更改设置应用程序内的设置,然后恢复您的应用程序,并期望这些更改已被应用。

1

由于@fluchtpunkt建议,您可以使用注册的默认值:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserDefaults" ofType:@"plist"]]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; 

就个人而言,我检查我的应用程序代表各自独立的价值。

#define kSettings [NSUserDefaults] 
if([kSettings boolForKey:@"firstRun"] == nil){ 

    // 
    // Set up the initial settings... 
    // 


    [kSettings setBool:NO forKey:@"firstRun"]; 
} 

我写了一个“重置”方法,然后在第一次运行时调用它。我更喜欢在代码中这样做,但理论上你可以使用plist。我只是觉得这是一个出错的地方。

0

@MatthiasBauch或@ Moshe的答案很可能适用于大多数人,但对于任何喜欢我在Root.plist文件中设置的人(我使用的是InAppSettingsKit),您必须深入了解一下特定的plist文件来获取设置的实际默认值(因为它们不在plist的顶层,但嵌套在键盘PreferenceSpecifiers下)。这里是另一种答案的链接在这里,包含额外的代码为我工作:

https://stackoverflow.com/a/10497898/381233