iPhone-注册的默认pref不会写入plist文件
我在我的应用程序上有以下代码(简单得多):使用选项完成启动:iPhone-注册的默认pref不会写入plist文件,iphone,default,nsuserdefaults,preferences,synchronize,Iphone,Default,Nsuserdefaults,Preferences,Synchronize,我在我的应用程序上有以下代码(简单得多):使用选项完成启动: NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultsPrefs" ofType:@"plist"]]; [[NSUserDefaults standardUserDefaults] registerDefaults:
NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultsPrefs" ofType:@"plist"]];
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];
NSLog(@"--------------- NSUserDefaults dump : %@", [prefs dictionaryRepresentation]);
BOOL a = [[NSUserDefaults standardUserDefaults] synchronize];
但是什么都没有写。。。我的意思是,没有写入pref文件。如果我强制[prefs setValue:someValue forKey:@“someKey”]代码>,则仅使用此键/值创建文件
为什么??
如何设置所有默认首选项,然后将它们写入磁盘
布尔a是肯定的。
NSLog返回整个DefaultPrefs文件内容,加上一些系统值,如:
AppleICUForce24HourTime = 1;
AppleKeyboardsExpanded = 1;
由于问题更改,答案不相关:
我猜文件DefaultPrefs实际上不在应用程序包中。检查plist是否是目标的一部分。您可以通过检查pathForResource:ofType:
返回的内容来判断它是否确实在捆绑包中
NSLog(@“%@,[[NSBundle mainBundle]pathForResource:@“plist”类型的“DefaultsPrefs”)代码>
这将输出(null)
(我猜)或路径。如果是(null)
,这就是您的问题。检查如何将资源添加到目标。复制代码并添加更多调试语句后,看起来事情似乎符合您的要求。我在Xcode 4中创建了一个新的基于视图的项目,添加了一个带有5个键的“DefaultsPrefs.plist”w/NSString
默认值,我的AppDelegate已更改为如下所示:
- (IBAction) savePreferences:(id)sender {
NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults];
NSLog(@"NSUserDefaults: %@", [prefs dictionaryRepresentation]);
[prefs synchronize];
[[NSUserDefaults standardUserDefaults] setObject:@"UpdatedKey1Val" forKey:@"MyKey1"];
[[NSUserDefaults standardUserDefaults] setObject:@"UpdatedKey2Val" forKey:@"MyKey2"];
NSLog(@"NSUserDefaults: %@", [prefs dictionaryRepresentation]);
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
NSLog(@"MyKey1 before registerDefaults: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"MyKey1"]);
NSLog(@"MyKey2 before registerDefaults: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"MyKey2"]);
NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultsPrefs" ofType:@"plist"]];
NSLog(@"MyKey1 from userDefaultsDefaults: %@", [userDefaultsDefaults objectForKey:@"MyKey1"]);
NSLog(@"MyKey2 from userDefaultsDefaults: %@", [userDefaultsDefaults objectForKey:@"MyKey2"]);
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];
NSLog(@"MyKey1 after registerDefaults: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"MyKey1"]);
NSLog(@"MyKey2 after registerDefaults: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"MyKey2"]);
[self savePreferences:nil];
return YES;
}
输出为(从NSUserDefaults
中剥离不相关的对):
如果再次运行,则输出开始:
MyKey1 before registerDefaults: UpdatedKey1Val
MyKey2 before registerDefaults: UpdatedKey2Val
这是意料之中的。你一定是做了一些不正确的事情,因为这似乎是正确的
如何设置所有默认首选项,然后将它们写入磁盘
为什么??默认情况下,没有任何内容写入磁盘。它们是默认值,不由用户设置,可以在程序的更高版本中更改。
不希望它们保存在首选项文件中。保存后,您无法区分用户更改的首选项和默认值,因此无法用较新的默认值替换它们
这和它应该做的完全一样
如果要写入首选项文件,请使用[[NSUserDefaults standardUserDefaults]setObject:foo-forKey:bar]
我想如果你真的想的话,你可以用for循环来实现
for (NSString *key in userDefaultsDefaults) {
[[NSUserDefaults standardUserDefaults] setObject:[userDefaultsDefaults objectForKey:key] forKey:key];
}
但如果你真的需要保存这些默认值,你应该重新考虑。我想不出这样做的正当理由。@greg:是的,是这样。不需要登录。我在应用程序中使用默认加载的pref,它们在这里如文件中所述。@greg:NSLog返回/var/mobile/Applications/92B9BABF-CE37-44A9-B09B-516AC70BCF43/MyApp.app/DefaultsPrefs。plist@greg:NSLog(@“NSUserDefaults转储:%@,[[NSUserDefaults standardUserDefaults]dictionaryRepresentation]);在控制台中写入plist文件的全部正确内容,以及许多系统内容liekAppleCuforce24小时=1;AppleKeyboards=(“fr_FR@hw=法语;sw=AZERTY“emoji@sw=表情符号“);AppleKeyboardsExpanded=1代码>。但是什么都没有写。。。我的意思是,没有写pref文件。如果我强制用户默认值`setValue:someValue-forKey:@“someKey”];,然后,仅使用此键/值创建文件,其他默认值也是预期值(请参阅文档)。假设self.prefsVersion
是属性列表对象(NSString
,NSData
,NSDate
,NSNumber
,NSArray
或NSDictionary
),您的代码似乎是正确的NSLog()
设置完standardUserDefaults
中的值后立即进行设置。通常,您不需要调用synchronize
,但您可以检查它是否返回否
,就像它无法同步一样。@greg:synchronize返回是。self.prefsVersion是一个NSString.ok,但是您是否尝试从iPhone下载prefs编写的文件(Organize-单击应用程序-下载)。如果删除setObject语句,或者保留它们但添加一个以后未设置的默认键,是否会创建并填充默认值?如果使用setObject更改一个prefs值,终止应用程序进程,然后再次启动,会发生什么?更改的值是否已还原?只需尝试NSDictionary*userDefaultsDefaults=[NSDictionary Dictionary WithContentsOfFile:[[NSBundle mainBundle]pathForResource:@“DefaultsRefs”,类型为:@“plist”];[[NSUserDefaults standardUserDefaults]registerDefaults:userDefaultsDefaults];[[NSUserDefaults standardUserDefaults]同步]代码>。未保存任何pref文件。如果只更改一个值,则只保存该值。是的,我从答案中的代码开始。我强烈建议你创建一个新的临时项目来说服自己。对不起,我已经创建了测试项目。复制/粘贴您的答案代码,注释2行setObject。并且不创建prefs plist文件。取消对一行setObject的注释,plist文件将仅使用这一行创建。你肯定错过了什么。您是否尝试从iPhone下载项目内容?你应该明白我说的。试着在模拟器上点击home按钮并等待一秒钟,而不是在Xcode中点击stop按钮。否则系统将不会保存pref文件。@sudo rm-rf:这不会改变任何东西。您在哪里查找此首选项文件?@sudo rm-rf:Xcode-Organizer--应用程序选择--下载(我正在手机上测试)很好。比如说我按照你说的那样工作。如果我构建一个1.0应用程序,默认值为2个字符串。在2.0版本中,我决定删除第一个旧字符串,并将第二个字符串(更改其键字符串)与新的第三个字符串一起移动到数组中。我该怎么处理?这是我当前的最后一个问题,也是我希望能够阅读所有由当前1.0应用程序编写并稍后由2.0应用程序读取/转换的旧Pref的原因。我将在一分钟内回答其他问题。谢谢。这是你的电话号码
for (NSString *key in userDefaultsDefaults) {
[[NSUserDefaults standardUserDefaults] setObject:[userDefaultsDefaults objectForKey:key] forKey:key];
}