Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.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
Ios 设置捆绑默认值赢得';t集_Ios_Objective C_Nsuserdefaults_Settings.bundle - Fatal编程技术网

Ios 设置捆绑默认值赢得';t集

Ios 设置捆绑默认值赢得';t集,ios,objective-c,nsuserdefaults,settings.bundle,Ios,Objective C,Nsuserdefaults,Settings.bundle,我有一个带有settings.bundle的iOS应用程序,它通过开关切换处理我的应用程序的各种设置。我将root.plist文件中的默认值(使用DefaultValue属性)设置为YES,但每当应用程序在设备或iOS模拟器上启动时,所有值都会变为NO。它只在第一次发射时运行良好 我正在使用此代码检索默认值(我在这里是否做错了什么?) 默认值仅由Settings.app用于显示目的。如果不更改设置应用程序中的值,则不会将任何内容保存为NSUserDefaults 您必须自己注册默认值。在应用程

我有一个带有settings.bundle的iOS应用程序,它通过
开关切换处理我的应用程序的各种设置。我将root.plist文件中的默认值(使用DefaultValue属性)设置为
YES
,但每当应用程序在设备或iOS模拟器上启动时,所有值都会变为
NO
。它只在第一次发射时运行良好

我正在使用此代码检索默认值(我在这里是否做错了什么?)


默认值仅由Settings.app用于显示目的。如果不更改设置应用程序中的值,则不会将任何内容保存为NSUserDefaults

您必须自己注册默认值。在
应用程序:didFinishLaunchingWithOptions:
中使用类似的方法:

NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [NSNumber numberWithBool:YES], @"localetime",
                                      nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];

这篇博文可能会有帮助:

tl;dr-在用户打开设置页面之前,默认设置不会复制到应用程序中。这是苹果的预期行为


我个人认为这很糟糕。这意味着您必须在代码中设置默认值,以防用户不首先进入设置页面就启动您的应用程序(大约99%的用例都是这样!)

问题在于
默认值的类型必须是
布尔值
而不是
字符串
;)删除此值并再次添加另一个
默认值
属性
希望这对您有所帮助

您可以通过获取objectForKey并检查它是否为nil来检查该值是否已设置

   NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
   id dataExists = [userDefaults objectForKey:@"light_switch"];
   BOOL lightSwitch;
   if (dataExists != nil) {
      lightSwitch = [userDefaults boolForKey:@"light_switch"];
       NSLog(@"light_switch is %d", validateCertificates);
   } else {
      lightSwitch = YES; // default value
      NSLog(@"light_switch not set, default value is %d", validateCertificates);
   }
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项{
//<寄存器默认值
NSString*settingsBundlePath=[[NSBundle mainBundle]路径用于资源:@“bundle”类型的@“Settings”;
NSBundle*settingsBundle=[NSBundle bundleWithPath:settingsBundlePath];
NSString*rootPlistPath=[settingsBundle pathForResource:@“Root”类型:@“plist”];
NSDictionary*settingsDict=[[NSDictionary alloc]initWithContentsOfFile:rootPlistPath];
NSArray*settingsItems=[settingsDict objectForKey:@“首选项说明符”];
NSMutableDictionary*defaultDict=[NSMutableDictionary new];
用于(设置站点中的NSDictionary*itemDict){
if([itemDict objectForKey:@“DefaultValue”]){
[defaultDict setObject:[itemDict objectForKey:@“DefaultValue”]forKey:[itemDict objectForKey:@“Key”];
}
}
[[NSUserDefaults standardUserDefaults]registerDefaults:defaultDict];
//<以下代码
}

我们也能看到plist吗?不!什么也没发生!同样的问题。。。Xcode4.2有很多bug+1可以提供最佳建议,但这是一个解决办法,因为这种方式设置的值可能不同于plist中的默认值。如果用户未设置任何内容,则最好将plist中的默认值作为显示值。谢谢您让我在接下来的一个小时里不用头撞桌子。tl;dr代表“太长了;我的回答的第二段总结了这篇博文,以防你没有阅读;)基本上,您必须处理代码和plist中的默认值-plist只有在用户首先进入设置页面时才生效。请参阅其中的说明,当用户进入设置时,并不是所有类型都设置了默认值,在某些情况下,用户必须在为该项保存任何值之前实际选择默认值以外的值。在我的例子中,我注意到多值项没有被设置为默认值。这些值可以是任何类型的坏的,处理问题的坏方法。使用
-registerDefaults:
。如果您没有任何变量设置,您可以从iOS设置更改这些设置。但是,如果是,请更改If语句以检查“Key”是否不存在,如果不存在,请将其Key的默认值对象设置为
NSUserDefaults
   NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
   id dataExists = [userDefaults objectForKey:@"light_switch"];
   BOOL lightSwitch;
   if (dataExists != nil) {
      lightSwitch = [userDefaults boolForKey:@"light_switch"];
       NSLog(@"light_switch is %d", validateCertificates);
   } else {
      lightSwitch = YES; // default value
      NSLog(@"light_switch not set, default value is %d", validateCertificates);
   }
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //< Register Defaults
    NSString *settingsBundlePath = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
    NSBundle *settingsBundle = [NSBundle bundleWithPath:settingsBundlePath];
    NSString *rootPlistPath = [settingsBundle pathForResource:@"Root" ofType:@"plist"];
    NSDictionary *settingsDict = [[NSDictionary alloc] initWithContentsOfFile:rootPlistPath];
    NSArray *settingsItems = [settingsDict objectForKey:@"PreferenceSpecifiers"];
    NSMutableDictionary *defaultDict = [NSMutableDictionary new];
    for (NSDictionary *itemDict in settingsItems) {
        if ([itemDict objectForKey:@"DefaultValue"]) {
            [defaultDict setObject:[itemDict objectForKey:@"DefaultValue"] forKey:[itemDict objectForKey:@"Key"]];
        }
    }
    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultDict];
    //< Following Code
}