在哪里初始化iPhone应用程序默认值

时间:2011-01-30 13:50:01

标签: iphone cocoa-touch nsuserdefaults

我刚刚开始使用首选项窗格让用户在我的iOS应用中自定义一些设置,并且很容易创建Settings.bundle并从中访问信息。我的问题是我在Apple文档中读到应该以编程方式初始化设置:

  

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

应用程序中的这个初始化完成了,我怎么能确定我没有覆盖用户提供的值?这是在App Delegate的某些方法中处理的吗?

4 个答案:

答案 0 :(得分: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的密钥相同,值为defaultvalue。 挺直的。
你如何创建字典并不重要。你也可以在代码中完成它。

答案 1 :(得分:1)

正如@fluchtpunkt建议的那样,您可以使用以下方式注册默认值:

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

就个人而言,我在App Delegate中独立检查每个值。

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

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


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

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

答案 2 :(得分:0)

您可以在用于设置初始窗口的app委托中使用相同的方法didFinishLaunchingWithOptions:

但是,您可能还需要applicationWillEnterForeground中的一些逻辑:因为您的用户可能会将您的应用置于后台,更改设置应用内的设置,然后恢复您的应用并期望已应用这些更改。

答案 3 :(得分:0)

@MatthiasBauch或@Moshe的答案很可能适用于大多数人,但对于喜欢我的人在Root.plist文件中设置了他们(我使用的是InAppSettingsKit),你必须挖掘一下更深入到该特定的plist文件以获取设置的实际默认值(因为它们不在plist的顶层,而是嵌套在键PreferenceSpecifiers下)。这里是另一个答案的链接,其中包含对我有用的额外代码:

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