在何处初始化iPhone应用程序默认值

在何处初始化iPhone应用程序默认值,iphone,cocoa-touch,nsuserdefaults,Iphone,Cocoa Touch,Nsuserdefaults,我刚开始使用首选项窗格让用户自定义iOS应用程序中的一些设置,创建settings.bundle并从中访问信息非常容易。我的问题是,我在Apple文档中读到设置应该通过编程进行初始化: 建议您在启动时以编程方式注册任何默认首选项值,并将其包括在设置包属性列表中。对于新安装的应用程序,在运行设置应用程序之前,不会设置应用程序设置包中的默认首选项值。这意味着,如果用户在运行设置之前运行应用程序,则设置包中指定的默认值将不可用在启动时以编程方式设置这些值可确保应用程序始终具有适当的值。要以编程方式注册

我刚开始使用首选项窗格让用户自定义iOS应用程序中的一些设置,创建settings.bundle并从中访问信息非常容易。我的问题是,我在Apple文档中读到设置应该通过编程进行初始化:

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


该初始化在应用程序中的何处完成,如何确保没有覆盖用户提供的值?这在应用程序代理的某些方法中得到处理吗?

您可以在应用程序代理中使用与设置初始窗口相同的方法,didFinishLaunchingWithOptions:


但是,您可能还需要applicationWillEnterForeground:中的一些逻辑,因为您的用户可能会将您的应用程序放到后台,更改设置应用程序中的设置,然后继续您的应用程序,并期望这些更改已应用。

在尝试访问存储在NSUserDefaults中的值之前,您应该注册默认值。 您可以在
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项

注册默认值很快,因此无需对此进行优化。只需在应用程序启动时执行即可

我将userdefaults存储在plist中,并注册此列表的内容,如下所示:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserDefaults" ofType:@"plist"]];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
NSInteger minutesToWait = [[NSUserDefaults standardUserDefaults] integerForKey:@"MinutesToWait";
NSString *urlString = [[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultURLStr"];
如果像这样注册默认值,就不必担心覆盖用户提供的值。 NSUserdefaults使用“域”存储其值。如果您注册默认值,它们将存储在注册域中。如果用户存储一个值,这些值将存储在应用程序域中

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


编辑:

您可以像这样访问这些值(或者更好,访问存储在nsuserdefaults中的值,如果没有用户提供的值,则访问作为备用值的值):

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserDefaults" ofType:@"plist"]];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
NSInteger minutesToWait = [[NSUserDefaults standardUserDefaults] integerForKey:@"MinutesToWait";
NSString *urlString = [[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultURLStr"];
plist只是NSDictionary的另一种表示形式,包含键和值。该键与用于访问userdefaults的键相同,值是您的defaultvalue。 非常直截了当。

你如何创建字典并不重要。您也可以在代码中完成

正如@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"]; 
}

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

@MatthiasBauch或@Moshe的答案很可能适用于大多数人,但对于像我一样在Root.plist文件中有设置的人(我正在使用),你必须深入挖掘特定的plist文件,以获得设置的实际默认值(因为它们不在plist的顶层,而是嵌套在键
首选项说明符
)下。这里有一个指向另一个答案的链接,其中包含对我有用的额外代码:


那么plist看起来会是什么样子呢?只是一组与性能名称关联的键/值对?代码是否在
-(void)applicationdFinishLaunching:(UIApplication*)应用程序中
还是必须在
-(BOOL)application:(UIApplication*)application difinishLaunchingwithoptions中(NSDictionary*)出于某种原因启动选项?@bill shiff无论您在何处执行此操作,只要您在尝试访问用户默认值之前执行此操作即可。其余内容,请参阅我的编辑