Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone-注册的默认pref不会写入plist文件_Iphone_Default_Nsuserdefaults_Preferences_Synchronize - Fatal编程技术网

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文件的全部正确内容,以及许多系统内容liek
AppleCuforce24小时=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];
}