我使用此代码从图像选择器使用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'" ; p>
答案 0 :(得分:1)
决不允许用户NSUserDefaults
存储图片或其他大量数据。您只需将文件存储在文件系统上即可。
除此之外,您从存储数据创建图像的代码存在缺陷。你想要这个:
NSData *imageData = [defaults_bgvw objectForKey:@"image"];
UIImage *bgImage = [UIImage imageWithData:imageData];
UIImageView *bgImageView = [[UIImageView alloc] initWithImage:bgImage];
注意代码是如何分开的。这更容易阅读,也更容易调试。
但同样,不要将图像存储在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];