从图像选择器中将图像保存在 nsuserdeafult 中并获取其他视图控制器
save image in nsuserdeafult from image picker and get other view controller
我使用以下代码使用 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];
当我 运行 此代码出现类似
的错误时
"Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFData hasPrefix:]: unrecognized selector sent to instance 0x147c8590'"
切勿让用户 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
,绝对不需要只是读取值。
您可以使用以下方法将自定义对象保存并加载到 NSUserDefault
中。您需要使用 NSKeyedArchiver
class。
备用 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];
我使用以下代码使用 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];
当我 运行 此代码出现类似
的错误时"Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFData hasPrefix:]: unrecognized selector sent to instance 0x147c8590'"
切勿让用户
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
,绝对不需要只是读取值。
您可以使用以下方法将自定义对象保存并加载到 NSUserDefault
中。您需要使用 NSKeyedArchiver
class。
备用 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];