iOS 使用NSUserDefaults存取头像

来源:互联网 发布:access数据库教程视频 编辑:程序博客网 时间:2024/06/05 07:47

本文将实现功能:
在应用的个人设置页面从相册或者拍照获取一张头像,并将这张头像照片保存在nsuserdefaults中,返回到了个人中心页面后,再从nsuserdefaults取出该头像显示在页面。

  • 显示拍照/从相册选择的UIAlertController,让用户选择某种获取头像的方式
#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(@"该设备无摄像头");    }}
  • 然后实现两种方式都会执行的回调方法,在该回调方法中做3件事,第一是将获取到的image转换成data,第二是将该data保存在nsuserdefaults中方便下次获取,第三是将该image显示在当前页面。该回调方法如下:
/** *  图像选取器的委托方法,选完图片后回调该方法 */-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo{    /* 当图片不为空时显示图片并保存图片 */    if (image != nil)    {        /* 图片显示在界面上 */        // [_iconButton setBackgroundImage:image forState:UIControlStateNormal]; // 显示在按钮上        /* 以下是保存文件到沙盒路径下 */        /* 把图片转成NSData类型的数据来保存文件 */        NSData *data;        /* 判断图片是不是png格式的文件 */        if (UIImagePNGRepresentation(image))        {            /* 返回为png图像 */            data = UIImagePNGRepresentation(image);        }        else        {            /* 返回为JPEG图像 */            data = UIImageJPEGRepresentation(image, 1.0);        }         /* 保存 */        [LoginState saveUserInfoToUserdefaults:UserHeadImage andInfo:data];//        将图片显示在界面上        _headImage = [UIImage imageWithData:data];        [self.tableView reloadData];    }    /* 关闭相册界面 */    [picker dismissViewControllerAnimated:YES completion:^{    }];}
  • 然后,在上一步中保存用到的[LoginState saveUserInfoToUserdefaults:UserHeadImage andInfo:data];方法是一个需要自己实现的类方法,我定义在了工具类LoginState中,具体实现如下:
/** * 保存指定类型用户信息到userDefaults */+(void)saveUserInfoToUserdefaults:(InfoTypeIndex)type andInfo:(NSObject *)userInfo{    //        使用NSUserDefaults来保存用户数据    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];    switch (type) {        case UserHeadImage:            [userDefaults setObject:userInfo forKey:@"UserHeadImage"];            break;        case UserName:            [userDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:userInfo] forKey:@"UserName"];            break;        default:            break;    }    [userDefaults synchronize];}/** * 取出指定类型用户信息到userDefaults */+(NSObject *)takeUserInfoToUserdefaults:(InfoTypeIndex)type{    //        使用NSUserDefaults来保存用户数据    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 = [[NSString alloc] initWithData:infoData encoding:NSUTF8StringEncoding];            break;        default:            break;    }    return userInfo;}
  • 当下次调到需要显示头像的页面的时候,只要这样调用就可以获取到头像了:
UIImage *head = (UIImage *)[LoginState takeUserInfoToUserdefaults:UserHeadImage];
  • 由于是公司的应用,这里不方便附上效果图。这里把我这里用到的LoginState工具类上传,方便大家下载直接使用。写文章不易,但更难得的是分享的精神,如果觉得好,请给本文点个赞,Thanks a lot~
    以下是csdn下载链接:
    http://download.csdn.net/detail/u012320459/9574431
3 0
原创粉丝点击