Preference偏好设置

一. 偏好存储使用场景

  • 用户存储偏好设置
  • 缓存信息
  • 轻量级数据存储
  • 不可用于存储大量数据
  • 不要滥用synchronize方法
  • 警惕数据被清空,因为NSUserDefaults是单例类,代码的任何地方都可以将它删除

二. 偏好存储工作原理

三. 偏好存储支持的数据类型

不可存储可变类型



不可存储可变类

四. 偏好存储的增加、读取、修改、删除

//
//  ViewController.m
//  UserDefaultDemo


#import "ViewController.h"

@interface ViewController ()
- (IBAction)addPreference:(id)sender;
- (IBAction)readPreference:(id)sender;
- (IBAction)modifyPreference:(id)sender;
- (IBAction)deletePreference:(id)sender;
- (IBAction)clearAllPreference:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (IBAction)addPreference:(id)sender {
    //增加偏好设置
    //获取NSUserDefault类实例
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    //存储数字类型
    [userDefaults setBool:NO forKey:@"BoolKey"];
    [userDefaults setInteger:123 forKey:@"IntegerKey"];
    [userDefaults setFloat:0.123 forKey:@"FloatKey"];
    [userDefaults setDouble:0.123456 forKey:@"DoubleKey"];
    //存储字符串类型
    [userDefaults setObject:@"Hello" forKey:@"StringKey"];
    //存储NSData类型
    NSData *data = [@"hello Data" dataUsingEncoding:NSUTF8StringEncoding];
    [userDefaults setObject:data forKey:@"DataKey"];
    //存储数组类型
    NSArray *array = @[@"one",@"two",@"three"];
    [userDefaults setObject:array forKey:@"ArrayKey"];
    //存储字典类型
    NSDictionary *dict = @{@"key1":@"value1",@"key2":@"value2",@"key3":@"value3"};
    [userDefaults setObject:dict forKey:@"DictionaryKey"];
    
    [userDefaults synchronize];//将存储的偏好存储内容同步到ROM中
}

- (IBAction)readPreference:(id)sender {
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    //读取数字值
    BOOL readBool = [userDefaults boolForKey:@"BoolKey"];
    NSLog(@"Bool value is:%@",readBool?@"YES":@"NO");
    
    NSInteger readInteger = [userDefaults integerForKey:@"IntegerKey"];
    NSLog(@"Integer value is:%ld",readInteger);
    
    float readFloat = [userDefaults floatForKey:@"FloatKey"];
    NSLog(@"Float value is:%f",readFloat);
    
    double readDouble = [userDefaults doubleForKey:@"DoubleKey"];
    NSLog(@"Double value is:%lf",readDouble);
    
    //读取字符串值
    NSString* readString = [userDefaults objectForKey:@"StringKey"];
    NSLog(@"String value is:%@",readString);
    
    //读取NSData值
    NSData* readData = [userDefaults objectForKey:@"NSDataKey"];
    NSString* dataToString = [[NSString alloc]initWithData:readData encoding:NSUTF8StringEncoding];
    NSLog(@"NSData value is:%@",dataToString);
    //读取数组值
    NSArray* readArray = [userDefaults objectForKey:@"ArrayKey"];
    NSLog(@"Array value is:%@",readArray);
    //读取字典值
    NSDictionary* readDictionary = [userDefaults objectForKey:@"DictionaryKey"];
    NSLog(@"Dictionary value is:%@",readDictionary);
}

- (IBAction)modifyPreference:(id)sender {
    //修改偏好设置 修改和增加其实是一样的
    //获取NSUserDefault类实例
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    //更新数字类型
    [userDefaults setBool:YES forKey:@"BoolKey"];
    [userDefaults setInteger:456 forKey:@"IntegerKey"];
    [userDefaults setFloat:3.14 forKey:@"FloatKey"];
    [userDefaults setDouble:9.87654 forKey:@"DoubleKey"];
    //更新字符串类型
    [userDefaults setObject:@"World" forKey:@"StringKey"];
    //更新NSData类型
    NSData *data = [@"new Data" dataUsingEncoding:NSUTF8StringEncoding];
    [userDefaults setObject:data forKey:@"DataKey"];
    //更新数组类型
    NSArray *array = @[@"four",@"five",@"six"];
    [userDefaults setObject:array forKey:@"ArrayKey"];
    //更新字典类型
    NSDictionary *dict = @{@"key5":@"value5",@"key6":@"value6",@"key7":@"value7"};
    [userDefaults setObject:dict forKey:@"DictionaryKey"];
    
    [userDefaults synchronize];//将存储的偏好存储内容同步到ROM中
}

- (IBAction)deletePreference:(id)sender {
    //获取NSUserDefaults实例
    NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
    
    //存储数字值
    [userDefaults removeObjectForKey:@"BoolKey"];
    [userDefaults removeObjectForKey:@"IntegerKey"];
    [userDefaults removeObjectForKey:@"FloatKey"];
    [userDefaults removeObjectForKey:@"DoubleKey"];
    //存储字符串值
    [userDefaults removeObjectForKey:@"StringKey"];
    //存储NSData值
    [userDefaults removeObjectForKey:@"NSDataKey"];
    //存储数组值
    [userDefaults removeObjectForKey:@"ArrayKey"];
    //存储字典值
    [userDefaults removeObjectForKey:@"DictionaryKey"];
    
    //同步数据
    [userDefaults synchronize];
}

- (IBAction)clearAllPreference:(id)sender {
    //删除所有偏好存储
    //获得应用的域的字符串
    NSString *appDomainString = [[NSBundle mainBundle]bundleIdentifier];
    //清空偏好存储
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomainString];
}
@end

五. 案例——缓存设置页面

//
//  ViewController.m
//  SettingDemo

#import "ViewController.h"

@interface ViewController ()<UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *myTextField;
@property (weak, nonatomic) IBOutlet UISwitch *mySwitch;
- (IBAction)switchAction:(UISwitch *)sender;
@property (weak, nonatomic) IBOutlet UISlider *mySlider;
- (IBAction)sliderAction:(UISlider *)sender;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _myTextField.delegate = self;
    [self loadPreference];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
//加载偏好存储的值
- (void)loadPreference {
    NSString *string = [[NSUserDefaults standardUserDefaults]objectForKey:@"textKey"];
    _myTextField.text = string;
    
    BOOL switchValue = [[NSUserDefaults standardUserDefaults]boolForKey:@"switchKey"];
    _mySwitch.on = switchValue;
    
    float sliderValue = [[NSUserDefaults standardUserDefaults]floatForKey:@"sliderKey"];
    _mySlider.value = sliderValue;
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    NSLog(@"字符串变为:%@",textField.text);
    //存储/更新字符串的值
    [[NSUserDefaults standardUserDefaults] setObject:textField.text forKey:@"textKey"];
    //更新偏好存储到ROM中
    [[NSUserDefaults standardUserDefaults]synchronize];
}

- (IBAction)switchAction:(UISwitch *)sender {
    NSLog(@"开关变为:%d",sender.isOn);
    //存储/更新开关的值
    [[NSUserDefaults standardUserDefaults] setBool:sender.isOn forKey:@"switchKey"];
    [[NSUserDefaults standardUserDefaults]synchronize];
    
}
- (IBAction)sliderAction:(UISlider *)sender {
    NSLog(@"滑块位置:%f",sender.value);
    //存储/更新滑块的值
    [[NSUserDefaults standardUserDefaults] setFloat:sender.value forKey:@"sliderKey"];
    [[NSUserDefaults standardUserDefaults]synchronize];
}

//隐藏键盘
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
@end
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容