有什么用 – ?
有什么区别:
[[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectAndKey:anObject, @"something"]];
和这个:
[[NSUserDefaults standardUserDefaults] setObject:anObject forKey:@"something"];
不同之处在于,您注册的第一个代码片段默认将在用户未对“属性”进行任何更改时使用。
所以如果你想提供一个名为“欢迎消息”的密钥名称的“属性”,你可以不用让返回的属性插入默认消息“欢迎第一次使用”,当没有财产的变化。
这将简化您的逻辑,因为您不需要编写if
testing来检查“属性”是否返回nil,然后再发送另一条消息(如果是这种情况)。
NSString *greeting = [[NSUserDefaults standardUserDefaults] stringForKey:@"Greeting"]; if(greeting == nil) { NSLog(@"Welcome first-time user!"); }
您发布的第二个代码片段用于将该属性设置为另一个值。 你将有不同的设置方法(setString,setObject,setBoolean)来设置取决于你的程序状态在Userdefaults中的值。
编辑—–根据要求更新评论。
第一种方法是将值注册为默认值,顾名思义。 第一次用某个键名访问属性时,对象的值为零,布尔值为false或数字为0。 而不是做很多的testing等等,所以如果程序中没有设置这些值,然后做一些“默认的”操作,比如上面的例子,那么你可以用一些已经为这些键预定义的值来运送你的应用程序。
一个典型的放置registerDefaults的地方是在appDelegate的初始化方法中。
然后在你的程序中的某个地方,你可能想要设置这些字段的值,然后你使用setObject,setString,setBoolean …和检索你使用stringForKey,objectForKey …
把它想成是这个
registerDefaults是可以为对象提供合理值的构造函数,否则你会得到一些我已经写过的默认值。 然后稍后如果你想改变对象的属性,你不要使用“构造函数”,而是使用set / get方法。
长话短说,
[[NSUserDefaults standardUserDefaults] setObject:@"Entropy" forKey:@"kName"]
将“Entropy”保存到Library / Preference文件夹中的一个名为com.example.Demo.plist的文件中(其中com.example.Demo是您的Bundle ID,请参阅IOS应用程序安全性第20部分 – 本地数据存储 )
[[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,如果该键不是由
registerDefaults
和setObject:forKey:
设置的,则为对象为零setObject:forKey:
在本例中为“kBrowser”)
和registerDefaults
的用法
从首选项和设置编程指南引用
如果这些标准默认值不适合您的应用程序,则可以使用registerDefaults:方法注册您自己的默认值。 此方法将您的自定义默认值放置在NSRegistrationDomain域中,这会导致在未显式设置首选项时返回它们。
从如何使用NSUserDefaults保存数据引用
另一个技巧是你可以用一个预定义的NSDictionary对象来初始化你的NSUserDefaults。 例如,您可以在用户有机会与您的程序进行交互之前将默认值设置为“false”或“true”。 在我的情况下,有时候我会创build一个代表游戏中所有关卡的数组,并在每个数组中存储一个布尔值来检查玩家是否已经完成关卡。 为此,我创build数据对象,然后使用NSUserDefaults注册它。 如果以前的值存在的对象,然后没有任何反应。 否则,我的空白对象被保存为“默认”的默认值
PS: Ole有一篇非常好的文章,详细解释了如何使用NSUserDefaults处理默认值
看另一种方式是这样的。 如果您从〜/ Library / Preferences中删除了首选项文件, registerDefaults
所设置的默认值将会被应用到应用程序,直到新的首选项被设置。
在Swift 2.1.1 Xcode 7.2中
我将这个片段添加到应用程序:didFinishLaunchingWithOptions来初始化tintColorsIndex,这是用户可以在应用程序中更改的参数之一。
let defaults = NSUserDefaults.standardUserDefaults() defaults.registerDefaults([ "tintColorsIndex" : -1, ])
当应用程序启动时,第一次tintColorsIndex将被赋值-1(一个Int)。 如果用户在使用应用程序的时候改变了颜色,他们的偏好在随后的启动时不会被覆盖。
用户默认值被分组到域中… registerDefaults用于将默认值添加到注册域..
您可以在首选项和设置编程指南中阅读有关域的信息。