前言:在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
大家自行下载,如果有问题欢迎提出哦