我对使用NSUserDefaults的应用程序首选项有几个问题。
在我的上一个应用程序中,我会使用绑定到NSUserDefaults链接我的首选项,这非常有效。在应用程序启动方法中,我可以根据存储在NSUserDefaults中的值执行操作。
当我更新我的应用程序并重新分发它时出现问题,其中所有设置都会被我的计算机中的首选项覆盖。因此,如果有人更改了设置,然后收到了更新,那么他们的设置将覆盖我的。
回顾有关保存首选项的Apple文档,我注意到以下不使用的行,用于将首选项写入磁盘:
[defaults synchronize];
我的问题是,此代码是否将首选项写入用户的硬盘驱动器,因此如果我使用不同的设置重新分发应用程序,NSUserDefaults会从磁盘读取吗?
很抱歉误会,但我找不到答案。
先谢谢大家。
答案 0 :(得分:3)
如果要使用绑定来控制首选项,则应使用NSUserDefaultsController
。在任何一种情况下,要设置默认值的初始值,您应该创建一个包含初始值的字典,然后如果您使用的是vanilla NSUserDefaults,或者registerDefaults:
或{{initWithDefaults:initialValues:
之一,则将其传递给setInitialValues:
。 1}}如果你正在使用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];
}
答案 1 :(得分: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];