0

我有几个关于使用 NSUserDefaults 的应用程序偏好的问题。

在我的最后一个应用程序中,我会使用绑定到 NSUserDefaults 将我的首选项链接起来,这非常有效。然后,在应用程序启动方法中,我可以根据存储在 NSUserDefaults 中的值执行操作。

当我更新我的应用程序并重新分发它时出现了问题,其中所有设置都将被我计算机中的首选项覆盖。因此,如果有人更改了设置,然后收到了更新,他们的设置就会被我的覆盖。

回顾有关保存首选项的 Apple 文档,我注意到以下我没有使用的行,它用于将首选项写入磁盘:

[defaults synchronize];

我的问题是,这段代码是否将首选项写入用户的硬盘,这样如果我使用不同的设置重新分发应用程序,NSUserDefaults 会改为从磁盘读取?

很抱歉造成误解,但我找不到答案。

提前谢谢大家。

4

2 回答 2

3

如果你想使用绑定来控制你的偏好,你应该使用NSUserDefaultsController. 在任何一种情况下,要为您的默认值设置初始值,您应该使用初始值创建一个字典,然后将其传递给registerDefaults:如果您使用的是 vanilla NSUserDefaults,initWithDefaults:initialValues:或者setInitialValues:如果您使用的是 NSUserDefaultsController 之一。这是一个 NSUserDefaultsExample:

- (void)applicationDidFinishLaunching {
    // For decent-sized applications, I normally like to store this in its own plist
    // but I'm creating it in-line here for readability's sake.
    NSDictionary *initialPreferences = [NSDictionary dictionaryWithObjectsAndKeys:
        [NSNumber numberWithInteger:21], @"UserAge",
        @"red", @"FavoriteColor",
        @"Idaho", "Location", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:initialPreferences];
}
于 2012-05-01T17:19:42.180 回答
0

NSUserDefaults仅在synchronize被调用时写入。

当您发布应用程序并希望在首次启动时进行特定设置时,您需要自己在代码中进行设置。我通常会查找nil特定键的值,如果它是空值,我将设置所需的“默认”值。

例子

我在应用程序启动时这样做:

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];

/*  count how many times the user has launched the app  */
int total = [[defaults objectForKey:@"kLaunchCount"] intValue];  total++;
[defaults setObject:[NSNumber numberWithInt:total] forKey:@"kLaunchCount"];

/*  User chose to reset Scanner Feed, remove the .plist from Documents directory.  */
if ( [[defaults objectForKey:@"kResetScannerFeeds"] boolValue] == YES ){
    [[NSFileManager defaultManager] removeItemAtPath:SCANNERFEED error:nil];
    [defaults setObject:[NSNumber numberWithBool:NO] forKey:@"kResetScannerFeeds"];
}

/*  Check to see if Default Prefs are NULL, if so, enable them.  */
if ( [defaults objectForKey:@"kShakeToToggleVisibility"] == nil ){
    [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"kShakeToToggleVisibility"];
}
if ( [defaults objectForKey:@"kBackgroundAudio"] == nil ){
    [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"kBackgroundAudio"];
}
if ( [defaults objectForKey:@"kUseMyLocation"] == nil ){
    [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"kUseMyLocation"];
}
if ( [defaults objectForKey:@"kAttachTwitterIcon"] == nil ){
    [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"kAttachTwitterIcon"];
}
if ( [defaults objectForKey:@"kAttachTwitterLink"] == nil ){
    [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"kAttachTwitterLink"];
}
/*  User chose to log out of Facebook Session, do that now.  */
if ( [[defaults objectForKey:@"kLogoutFacebook"] boolValue] == YES ){
    [defaults setObject:[NSNumber numberWithBool:NO] forKey:@"kLogoutFacebook"];
    [self fbLogout];
}

[defaults synchronize];
于 2012-05-01T17:09:13.110 回答