NSUserDefaults的操作类似于可变字典,它里面存放的也是一些键值对,对NSUserDefaults里的数据的操作都是通过关键字来操作的。并且NSUserDefaults使用的是单例模式,自始至终都只有一个NSUserDefaults对象,取到这个对象之后,对它里面的数据进行一些操作之后,这个对象里面存储的值变了,但是这个对象只是存在于内存中而已,为了保存下来改变之后的数据,我们要将内存中的NSUserDefaults对象和plist文件同步一下。通过单例模式获取NSUserDefaults对象的方法为standardUserDefaults,还有一些其他的操作如下:
通过单例模式获取NSUserDefaults对象
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
判断有没有
NSObject * obj = [defaults objectForKey:@"somekeyword"];
if(obj == nil)
{
如果obj等于nil的话,说明还没有存储这个值
}else
{
如果obj不等于nli的话,说话之前存储过这个值了
}
设置值
[defaults setObject:@"hello" forKey:@"somekeyword"];
取得值
NSString * str = [defaults stringForKey:@"somekeyword"];
删除值
[defaults removeObjectForKey:@"somekeyword"];
对defaults 的值操作完后,要和存储它的文件同步一下
[defaults synchronize];
对不同数据类型对应的读写方法
存储int整型数据
[defaults setInteger:myInteger forKey:@"myInteger"];
读取方法
NSInteger myInteger=[defaults integerForKey:@"myInteger"];
向NSUserDefaults注册默认值
我们在使用软件的时候,控件的一些属性一般都有默认值,同样的NSUserDefauults不只是在程序下一次运行的时候才能读出数据,第一次启动的时候,我们也可以给NSUserDefaults添加一些默认值。
NSUserDefaults提供了一个registerDefaults方法,通常在appDelegate的application:didFinishLaunchingWithOptions里调用,为NSUserDefaults注册默认值,这样在程序启动的时候就可以根据NSUserDefaults里面注册的默认值来初始化页面上的控件或者视图控制器的一些属性。
比如在application:didFinishLaunchingWithOptions方法里给NSUserDefaults注册两个默认值:
-(BOOL)application:(UIApplication *)application
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]];
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]];
self.window.rootViewController = self.viewController;
//在程序刚启动起来的时候,给NSUserDefaults注册了默认值
NSDictionary * defaultValues = [NSDictionary dictionaryWithObjectsAndKeys:@"black",@"color",@"tomson",@"username",nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
[self.window makeKeyAndVisible];
return YES;
}
当程序第二次启动的时候或者在注册默认值之前,NSUserDefaults里面已经有要注册的关键字了,这个时候NSUserDefaults对象调用registerDefaults方法时,会检查NSUserDefaults里是否已经存在了相同的key,如果有则不会把其覆盖,如果没有就添加进去。如在NSUserDefaults对象注册默认值之前,先设置了"color"对应的值,然后在注册默认值的时候也出现了"color"关键字,而且这个关键字对应的对象不一样,但是运行之后“color”关键字对应的值依然是"red"
使用NSUserDefaults进行控件状态保存
利用NSUserDefaults来保存控件的属性值
当控件的属性或状态改变的时候,就将改变之后的状态值存到NSUserDefaults中;
下次打开的时候,在显示本页面之前先读取NSUserDefaults中的值,并把这些值赋值给对应的控件的属性;
在读取NSUserDefaults中的值的时候,先判断值是否存在,存在就取出对应的值并给控件的属性赋值;不存在的话就给控件的属性赋一个默认值;
多加一个以HaveValue为关键字的值,用来表示NSUserDefaults中是否已经存储过界面状态的属性值,它是BOOL类型的值,如果NSUserDefaults存储过界面控件的属性值了,它就为YES,否则为NO,说明是第一次启动程序;
-(void)viewDidLoad
{
[super viewDidLoad];
//在显示控件的时候,先判断NSUserDefaults里是否已有值
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
if([defaults boolForKey:@"HaveValue"]==YES)
{
self.onOff.on = [defaults boolforKey:@"LightSwitch"];
self.mySlider.value = defaults floatForKey:@"LightSlider"];
self.showView.alpha = [defaults floatForKey:@"ViewAlpha"];
}else
{
self.onOff.on=YES;
self.mySlider.value = 1;
self.showView.alpha = 1;
}
}
-(IBAction)setLightSourceAlphaValue:(id)sender
{
//当改变控件的值之后,将控件的属性入NSUserDefaults
if(self.onOff.om)
{
self.showView.alpha = self.mySlider.value;
}else
{
self.showView.alpha = 0;
}
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:self.onOff.on forKey:@"LightSwitch"];
[defaults setFloat:self.mySlider.value forKey:@"LightSlider"];
[defaults setBool:YES forKey:@"HaveValue"];
[defaults synchronize];
}
当程序运行之后,因为第一次启动程序,NSUserDefaults里面还没有存储界面控件的状态属性,所以是取不出值的,这个时候根据if判断就会给界面控件的属性赋一个默认值。这个时候,UISwitch是ON开的状态,slider为最大值,既为不透明,滑动UISlider的时候就会改变UIView的透明度,显示出后面的黑色,这样的效果类似于改变了屏幕的亮度。UISwitch关闭的话,在滑动UISlider就无效了。
调节完“亮度”之后,按下home键,程序退出,再次点击程序或者重新运行Xcode,界面上的亮度和UISlider显示的值还是和退出之前的值一样。