将图像保存在 NSUserDefault 并进入其他 ViewController

Posted

技术标签:

【中文标题】将图像保存在 NSUserDefault 并进入其他 ViewController【英文标题】:Save image in NSUserDefault and get in other ViewController 【发布时间】:2013-03-19 07:03:59 【问题描述】:

我将图像保存在我的第一个视图控制器中的 nsuserdefaulf 中,我从 imagepicker 获取图像

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

我正在像这样在下一个 viewController 中获取此图像

 NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:@"image"];
 UIImage* image = [UIImage imageWithData:imageData];

但是当我传递此图像以供使用时,它给了我错误,但是当我使用这样的图像时,它会起作用。 ( bg.png 保存在项目中)

UIImage *image = [UIImage imageNamed:@"bg.png"];

我的代码有什么问题。 ?

【问题讨论】:

同步了吗??如果不这样做 [[NSUserDefaults standardUserDefaults] 同步]; 我建议你不要使用 NSUserDefaults。 我应该用什么来存储来自 imagepicker 的图像并在另一个视图控制器中使用它? NSUserDefaults 用于持久化用户设置,而不是在程序的各个部分之间传递瞬态对象。只需在一个对象上使用一个属性,这两者都有一个引用。 【参考方案1】:

Zohaib,您的代码中存在转换问题。 首先在“NSDATA”中转换你的图像,然后添加到“NSUserDefaults”

NSData *data = [NSData dataWithData:UIImageJPEGRepresentation(image);

然后你就可以取回数据了。

【讨论】:

谢谢它的工作,有两个问题1)你告诉我先在NSData中转换图像。 2)我的图像尺寸非常大,所以我不得不减小它的尺寸,它现在可以工作了。 这个答案没有意义。 UIImageJPEGRepresentation 返回一个 NSData 的实例。与 UIImageJPEGRepresentation 相比,对 dataWithData 的额外调用不会将图像“转换”为 NSData。 @AaronGolden 我使用了 UIImagePNGRepresentation。我尝试过使用 dataWithData,但即使我减小了图像大小,它也无法正常工作。但是当我尝试 dataWithdata 时它会起作用。【参考方案2】:

当你从选择器中选择图像时会调用这个方法

所以,把UIImage *imgGotFromPicker; 声明在.h 文件中

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    

    imgGotFromPicker = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

推送时将此图像发送到其他视图控制器。

在第二个视图控制器中:

@property(nonatomic, strong) UIImage *imgfromView;  in .h

@synthesize imgfromView = _imgfromView;  in .m

【讨论】:

【参考方案3】:

要保存图像并在任何其他视图中获取它,您可以使用此方法:

保存者:

[[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation(image);

检索方式:

NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:key];
UIImage* image = [UIImage imageWithData:imageData];

【讨论】:

【参考方案4】:

如果您的应用中有此图像,您是否应该保存图像名称? 商店:

[[NSUserDefaults standardUserDefaults] setObject:@"bg.png"forKey:@"image"];

然后在其他视图中使用此代码

阅读

UIImage *image = [UIImage imageNamed:[myUserDefaults valueForKey: @"image"]];

【讨论】:

我不想保存我在应用程序中的图像。我可以在我的项目中的任何地方阅读它。我想保存从 imagepicker 获取的图像并保存它,然后在另一个视图控制器中使用它【参考方案5】:

您将 NSData 直接保存到 NSUserDefaults 中。这不是执行此操作的正确过程。您需要使用 NSKeyedArchiver 和 NSKeyedUnarchiver 从 NSUserDefaults 保存和检索数据。所以请试试这个:

NSKeyedArchiver and NSKeyedUnarchiver

此链接将帮助您保存和检索数据。您还需要实现这两种方法:

-(void)encodeWithCoder:(NSCoder *)encoder




-(id)initWithCoder:(NSCoder *)decoder
 

  return self;

【讨论】:

以上是关于将图像保存在 NSUserDefault 并进入其他 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

NSUserDefault 有时不会保存自己

如果 Swift 中存在 NSUserDefault,则尝试更新 CLLocation

如何将可映射对象保存到 nsuserdefault?

保存用户配置文件和持久性

如何在 appdelegate 中使用 applicationDidEnterBackground 保存 NSUserDefault

NSUserDefault 更新公式