在哪里初始化iPhone应用程序的默认设置?

4
我刚开始使用首选项面板来让用户自定义我的iOS应用程序中的一些设置,创建Settings.bundle并从中访问信息非常容易。但是我在苹果文档中读到的问题是,设置应该通过编程方式初始化:
建议您在启动时以编程方式注册任何默认偏好值,以及将它们包含在您的设置束属性列表中。对于新安装的应用程序,直到运行设置应用程序才设置应用程序设置束中的默认偏好值。这意味着如果用户在运行设置之前运行您的应用程序,则不会提供在设置束中指定的默认值。在启动时以编程方式设置此类值可确保您的应用程序始终具有适当的值。要以编程方式注册默认值,请使用NSUserDefaults类的registerDefaults:方法。
在应用程序中,这个初始化在哪里完成,并且如何确保我没有覆盖用户提供的值?这是否在AppDelegate的某个方法中处理?
4个回答

11

在访问NSUserDefaults中存储的值之前,您应该先注册默认值。您可以在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中完成此操作。
注册您的默认值很快,因此无需进行优化。只需在应用程序启动时执行即可。

我将我的用户默认设置存储在一个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表示形式。键与访问用户默认值时使用的键相同,而值则是您的默认值。 非常简单明了。
无论您如何创建字典,都没有关系。您也可以在代码中创建它。


那么,这个属性列表会是什么样子呢?只是一组键值对,与首选项名称相对应吗?代码是在- (void)applicationDidFinishLaunching:(UIApplication *)application中还是必须在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中出现呢?是否有某种原因呢? - Bill Shiff
@bill shiff 不管你在哪里做这个,只要在尝试访问您的userdefaults之前完成即可。其他事项,请参见我的编辑。 - Matthias Bauch

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。我只是觉得这样做可以减少出错的可能性。

0

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

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


0

对于大多数人而言,@MatthiasBauch 或者 @Moshe 的答案可能是有效的,但是对于像我一样将其设置在 Root.plist 文件中(使用 InAppSettingsKit),你需要深入研究该特定 plist 文件,以获取设置的实际默认值(因为它们不在 plist 的顶层,而是嵌套在 PreferenceSpecifiers 键下)。这里是另一个答案链接,包含了对我有效的额外代码:

https://dev59.com/MnM_5IYBdhLWcg3wThV3#10497898


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接