从图像选择器中将图像保存在 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'"

  1. 切勿让用户 NSUserDefaults 存储图像或其他大量数据。您应该简单地将文件存储在文件系统上。

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

    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];