ios:使用NSUserDefaults存取用户头像等信息

前言:在ios开发中,当用户注册或登录时,不仅需要将用户信息提交到服务器,还需要将用户信息存储到本地,比如在app的个人中心中,下次打开app头像就会初始化为用户头像而不是默认头像。实现本地存取用户信息使用的是NSUserDefaults。本文已经将存取功能封装为工具类,在文章最后附上下载地址,大家可以下载参考哦。

一.NSUserDefaults存取基本类型:

1.NSUserDefaults存基本类型:

NSUserDefaults   *userDefaults = [NSUserDefaults standardUserDefaults];

NSInteger i = 0;

[userDefaults setInteger: i forKey: @"NSInteger"];

BOOL b = YES;

[userDefaults setBool: b forKey: @"BOOL"];

CGFloat f = 0.1;

[userDefaults setFloat: f forKey: @"CGFloat"];

2.NSUserDefaults取基本类型:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

NSInteger i = [userDefaults integerForKey: @"NSInteger"];

BOOL b = [userDefaults boolForKey: @"BOOL"];

CGFloat f = [userDefaults floatForKey: @"CGFloat"];

二.然而项目中要存取的信息是复杂的对象类型:

以上介绍的是如何用NSUserDefaults存取基本类型,我们要存取的用户信息一般包括:用户ID-NSString,用户密码-NSString,用户头像-UIImage...这些都是OC的对象类型,存储时要转为NSData。

所以:

存储的时候:对象-》NSData-》存储

取出的时候:NSData-》对象

三.获取用户头像:

一般app获取用户头像的方式分为两种:从相册选择、拍照。这里就介绍使用这两种方式:

#pragma mark更换头像点击

-(void) userIconChange{

UIAlertController *actionSheetController = [UIAlertController alertControllerWithTitle: @"更换头像" message: @"拍照或从相册中选择" preferredStyle: UIAlertControllerStyleActionSheet];

[actionSheetController addAction: [UIAlertAction actionWithTitle: @"拍照" style: UIAlertActionStyleDefault handler:^(UIAlertAction *_Nonnull action) {

[self takePhoto];

}]];

[actionSheetController addAction: [UIAlertAction actionWithTitle:@"打开相册"style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {

[self LocalPhoto];

}]];

[actionSheetController addAction: [UIAlertAction actionWithTitle:@"取消"style:UIAlertActionStyleCancel handler:^(UIAlertAction *_Nonnull action) {}]];

[self presentViewController: actionSheetController animated:YES completion:^{}];

}

/**

*从相册选择照片

*/

-(void)LocalPhoto

{

UIImagePickerController *picker = [[UIImagePickerController alloc]init];

/*资源类型为图片库*/

picker.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;

picker.delegate=self;

/*设置选择后的图片可被编辑*/

picker.allowsEditing=YES;

[self presentViewController:picker animated:YES completion:^{}];

}

/**

*拍照

*/

-(void)takePhoto

{

/*资源类型为照相机*/

UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;

UIImagePickerControllerQualityType qualityType = UIImagePickerControllerQualityTypeHigh;

/*判断是否有相机*/

if([UIImagePickerController isSourceTypeAvailable : UIImagePickerControllerSourceTypeCamera]){

UIImagePickerController *picker = [[UIImagePickerController alloc]init];

picker.delegate=self;

/*设置拍照后的图片可被编辑*/

picker.allowsEditing=YES;

/*资源类型为照相机*/

picker.sourceType= sourceType;

/*品质为高*/

picker.videoQuality= qualityType;

[self presentViewController: picker animated:YES completion:^{}];

}else

{NSLog(@"该设备无摄像头");}}

/**

*图像选取器的委托方法,选完图片后回调该方法

*/

-(void)imagePickerController: (UIImagePickerController*)picker didFinishPickingImage:(UIImage*)image editingInfo:(NSDictionary*)editingInfo {

/*当图片不为空时保存图片*/

if(image !=nil)

[LoginState saveUserInfoToUserdefaults: UserHeadImage andInfo:image];

/*关闭相册界面*/

[picker dismissViewController Animated:YES completion:^{}];

}

四.封装的存取用户信息的工具类方法:

第三步中用到的[LoginState saveUserInfoToUserdefaults: UserHeadImage andInfo:image]方法是我封装的登录工具类,这个方法根据指定的key存取信息,头像对应的key是UserHeadImage,大家可以自行定义枚举类型。工具类方法如下所示:

/**

*保存指定类型用户信息到userDefaults

*/

+(void)saveUserInfoToUserdefaults: (InfoTypeIndex)type andInfo:(NSObject*)userInfo{

NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];

switch(type) {

case UserHeadImage:{//这里保存的是image

UIImage *image = (UIImage*)userInfo;

[userDefaults setObject:[UIImage getDataFromImage: image] forKey: @"UserHeadImage"];}

break;

case UserName:

[userDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject: userInfo] forKey:@"UserName"];

default:break;}

[userDefaults synchronize];}

/**

*取出指定类型用户信息到userDefaults

*/

+(NSObject*)takeUserInfoToUserdefaults: (InfoTypeIndex)type{

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

NSData *infoData;

NSObject *userInfo;

switch(type) {

case UserHeadImage:

infoData = [userDefaults dataForKey:@"UserHeadImage"];

userInfo = [UIImage imageWithData:infoData];

break;

case UserName:

infoData = [userDefaults dataForKey:@"UserName"];

userInfo = [NSKeyedUnarchiver unarchiveObjectWithData: infoData];

break;

default:

break;

}

return userInfo;}

终于写完啦,这是我第一次使用,之前都是用CSDN写博客的。想哭....因为CSDN的markdawn感觉好好用。。。请大家原谅我初次使用导致的文章版面粗糙,让我下去研究下怎么写效率高文章美观,另外,上面有用到一个UIImage的扩展,将UIImage转换为NSData,我将这个方法写在这里,大家自己写成扩展就好:

//将UIImage转换为NSData

+(NSData*)getDataFromImage:(UIImage*)image{

NSData *data;

/*判断图片是不是png格式的文件*/

if(UIImagePNGRepresentation(image))

data = UIImagePNGRepresentation(image);

/*判断图片是不是jpeg格式的文件*/

else

data = UIImageJPEGRepresentation(image,1.0);

return data;

最后在这里附上我的CSDN博客链接:http://blog.csdn.net/u012320459,然后本文中用到的登录工具类在这篇文章最后有下载链接:http://blog.csdn.net/u012320459/article/details/51892927。

对哦,文章代码是实际项目中用到的,测试通过。

欢迎各种指点、指导、还有指教

-----------------------------更新分割线--------------------------------------

我把里面用到的Head.h文件和工具类都上传到百度云盘了:http://pan.baidu.com/s/1eRSy0ro

大家自行下载,如果有问题欢迎提出哦

你可能感兴趣的:(ios:使用NSUserDefaults存取用户头像等信息)