从图像选择器中保存nsuserdeafult中的图像并获取其他视图控制器

时间:2015-09-12 06:48:21

标签: ios uiimageview nsuserdefaults unrecognized-selector

我使用此代码从图像选择器使用NSUaerDefaults保存图像:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *image=[info objectForKey:UIImagePickerControllerOriginalImage];
    NSData *imagedata=[NSData dataWithData:UIImagePNGRepresentation(image)];
    NSUserDefaults *default_bg=[NSUserDefaults standardUserDefaults];
    [default_bg setObject:imagedata forKey:@"image"];
    [default_bg synchronize];
    [self dismissViewControllerAnimated:YES completion:nil];
}

使用此代码进入其他视图控制器:

NSUserDefaults *defaults_bgvw = [NSUserDefaults standardUserDefaults];
[defaults_bgvw synchronize];

UIImageView *bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[defaults_bgvw objectForKey:@"image"]]];

//bgImageView.contentMode=UIViewContentModeScaleAspectFit;
bgImageView.frame = self.view.bounds;
[self.view addSubview:bgImageView];
[self.view sendSubviewToBack:bgImageView];

当我运行此代码时出现错误,如

  

"由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [__ NSCFData hasPrefix:]:无法识别的选择器发送到实例0x147c8590'"

2 个答案:

答案 0 :(得分:1)

  1. 决不允许用户NSUserDefaults存储图片或其他大量数据。您只需将文件存储在文件系统上即可。

  2. 除此之外,您从存储数据创建图像的代码存在缺陷。你想要这个:

    NSData *imageData = [defaults_bgvw objectForKey:@"image"];
    UIImage *bgImage = [UIImage imageWithData:imageData];
    UIImageView *bgImageView = [[UIImageView alloc] initWithImage:bgImage];
    
  3. 注意代码是如何分开的。这更容易阅读,也更容易调试。

    但同样,不要将图像存储在NSUserDefaults

    无关,但以下一行:

    NSData *imagedata=[NSData dataWithData:UIImagePNGRepresentation(image)];
    

    可以简单地说:

    NSDate *imagedata = UIImagePNGRepresentation(image);
    

    无需创建额外的NSDate实例。

    不要不必要地致电synchronize。以下内容:

    NSUserDefaults *defaults_bgvw = [NSUserDefaults standardUserDefaults];
    [defaults_bgvw synchronize];
    

    应该只是:

    NSUserDefaults *defaults_bgvw = [NSUserDefaults standardUserDefaults];
    

    根本不需要调用synchronize,绝对不需要只读取值。

答案 1 :(得分:0)

你可以保存&使用以下方法将自定义对象加载到NSUserDefault。您需要使用NSKeyedArchiver类。

替代1:

- (void)saveCustomObject:(UIImage *)object key:(NSString *)key {
    NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:encodedObject forKey:key];
    [defaults synchronize];

}

- (UIImage *)loadCustomObjectWithKey:(NSString *)key {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *encodedObject = [defaults objectForKey:key];
    UIImage *object = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
    return object;
}

替代2: 将图片保存到NSUserDefaults

[[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation(image) forKey:@"myImage"];   

NSUserDefaults

中检索图片
NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myImage"];
UIImage* image = [UIImage imageWithData:imageData];