有什么用 - [NSUserDefaults registerDefaults:]?

时间:2011-02-08 08:58:14

标签: iphone cocoa-touch nsuserdefaults

有什么区别:

[[NSUserDefaults standardUserDefaults] registerDefaults:
  [NSDictionary dictionaryWithObjectAndKey:anObject, @"something"]];

而且:

[[NSUserDefaults standardUserDefaults] setObject:anObject forKey:@"something"];

5 个答案:

答案 0 :(得分:81)

不同之处在于您注册的第一个代码段默认值将在用户未对“属性”进行任何更改时使用。

因此,如果您想提供一个名为“欢迎消息”的“属性”,您可以代替将属性返回为nil,而不是插入默认消息“欢迎首次使用者”,该消息将在那里显示没有改变房产。

这将简化您的逻辑,因为您不需要编写if测试来检查“属性”是否返回nil,然后在这种情况下发出另一条消息。

NSString *greeting = [[NSUserDefaults standardUserDefaults] stringForKey:@"Greeting"];

if(greeting == nil) {
    NSLog(@"Welcome first-time user!");
}

您发布的第二个代码段用于将属性设置为其他值。您将使用不同的set方法(setString,setObject,setBoolean)来设置值,具体取决于Userdefaults中的程序状态。

编辑-----根据评论要求进行更新。

第一种方法是将值注册到默认值,顾名思义。第一次使用某个键名访问该属性时,对象的值为nil,布尔值为false,数字为0。如果没有在程序中设置值,然后执行某些“默认”操作(例如上面的示例),而不是执行大量测试等等,您可以使用这些键的一些已预定义的值发送应用程序。

将registerDefaults置于appDelegate中的初始化方法中的典型位置。

然后你的程序中的某个地方你可能想要设置这些字段的值然后你使用setObject,setString,setBoolean ...并且用于检索你使用stringForKey,objectForKey ......

将其视为

registerDefaults是你可以为对象提供合理值的构造函数,否则你会得到一些我已经写过的默认值。然后如果你想改变对象的属性,你不要使用“构造函数”而是使用set / get方法。

答案 1 :(得分:31)

长话短说,

[[NSUserDefaults standardUserDefaults] setObject:@"Entropy" forKey:@"kName"]

将“Entropy”保存到Library / Preference文件夹中名为com.example.Demo.plist的文件中(其中com.example.Demo是您的Bundle ID,请参阅IOS Application Security Part 20 – Local Data Storage

[[NSUserDefaults standardUserDefaults] setObject:@"Mac OS X" forKey:@"kOS"];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                @"Windows", @"kOS",
                                @"Google", @"kSearchEngine", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kOS"]);
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kSearchEngine"]);
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kBrowser"]);

将打印“Mac OS X”,“Google”,(null)

事实上,registerDefaults

  
      
  • 不保存到磁盘
  •   
  • 仅设置尚未设置的键的值(“kOS”由setObject:forKey:设置且“kSearchEngine”未设置)
  •   
  • 为标量值返回0,如果该键未由registerDefaultssetObject:forKey:(在这种情况下为“kBrowser”)设置,则对象为nil
  •   

使用registerDefaults

引自Preferences and Settings Programming Guide

  

如果这些标准默认值不适合您的应用,那么您   可以使用registerDefaults注册您自己的默认值:   方法。此方法将您的自定义默认值放在   NSRegistrationDomain域,导致它们在返回时返回   偏好未明确设定。

引自How to Save Data with NSUserDefaults

  

另一个提示是,您可以使用a初始化NSUserDefaults   预定义的NSDictionary对象。例如,你可以设置一个   在用户拥有之前,默认值为“false”或“true”   有机会与您的计划互动。在我的情况下,有时我创造   一个数组,表示我的游戏和每个数组中的所有级别   value我存储一个布尔值来检查玩家是否已经完成了关卡。   为此,我创建了数据对象,然后将其注册   NSUserDefaults的。如果对象存在先前的值,则   什么都没发生。否则我的空白对象将被保存为“默认”   默认值

PS: Ole有一篇非常好的文章详细解释Handling Default Values With NSUserDefaults

答案 2 :(得分:10)

另一种看待它的方式就是这样。如果从〜/ Library / Preferences中删除首选项文件,registerDefaults设置的默认值将是应用于应用程序的默认值,直到设置了新的首选项。

答案 3 :(得分:3)

在Swift 2.1.1 Xcode 7.2中

我将这个片段添加到应用程序:didFinishLaunchingWithOptions以初始化tintColorsIndex,这是用户可以在应用程序中更改的参数之一。

    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.registerDefaults([
        "tintColorsIndex" : -1,
        ])

当应用程序启动时,tintColorsIndex第一次被赋值为-1(Int)。如果用户在使用应用程序时更改了颜色,则在后续启动时不会覆盖其首选项。

答案 4 :(得分:1)

用户默认值在域中分组... registerDefaults用于向注册域添加默认值。

您可以在Preferences and Settings Programming Guide

中了解这些域名