iPhone:如何使用NSUserDefaults存储UIImage?

7

我无法使用NSUserDefaults保存图像并导致我的应用程序崩溃,我还使用了自定义类UserInfo

-(void)encodeWithCoder:(NSCoder *)encoder
{
   NSData *imageData = UIImagePNGRepresentation(categoryImage);
   [encoder encodeObject:categoryName forKey:@"name"];
   [encoder encodeObject:imageData forKey:@"image"];
}

-(id)initWithCoder:(NSCoder *)decoder和userInfo.categoryImage是UIImage变量。

原因:'-[UIImage encodeWithCoder:]:向实例0x7676a70发送未识别的选择器'

userInfo = [[UserInfo alloc] init];

userInfo.categoryName = categoryName.text;
NSLog(@"Category Name:--->%@",userInfo.categoryName);

userInfo.categoryImage = image;

appDelegate.categoryData = [[NSMutableDictionary dictionaryWithObjectsAndKeys:
                                 userInfo.categoryName, @"name",userInfo.categoryImage,@"image", nil] mutableCopy];


[appDelegate.categories addObject:appDelegate.categoryData];
NSLog(@"Category Data:--->%@",appDelegate.categories);

[appDelegate.categories addObject:userInfo.categoryName];
[appDelegate.categories addObject:userInfo.categoryImage];

[self saveCustomObject:userInfo.categoryName];

[self saveCustomObject:userInfo.categoryImage];


-(void)saveCustomObject:(UserInfo *)obj
{
    appDelegate.userDefaults = [NSUserDefaults standardUserDefaults];
    NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:obj];


    [appDelegate.userDefaults setObject:myEncodedObject forKey:@"myEncodedObjectKey"];
}

请帮我,如何使用NSUserDefaults存储和检索UIImage?


saveCustomObject 几乎无法工作,因为它将每个给定的对象都存储在相同的键下。 - Davyd Geyl
3个回答

33
如果我是你,我会将UIImage保存到文件中(使用[myImage hash]生成文件名),并将文件名保存为NSString使用NSUserDefault;-)

9
拜托了,把这个当作答案接受吧。在NSUserDefaults上保存UIImage真是一个很蠢的想法。 - Mugunth

23

UIImage没有实现NSCoding协议,这就是你遇到错误的原因。

存储:

NSData* imageData = UIImagePNGRepresentation(image);
NSData* myEncodedImageData = [NSKeyedArchiver archivedDataWithRootObject:imageData];
[appDelegate.userDefaults setObject:myEncodedImageData forKey:@"myEncodedImageDataKey"];
}

恢复:

NSData* myEncodedImageData = [appDelegate.userDefaults objectForKey:@"myEncodedImageDataKey"];
UIImage* image = [UIImage imageWithData:myEncodedImageData];

UserInfo 类实现 'NSCoding' 协议并归档整个 'userInfo' 对象。阅读此帖以获取更多信息:https://dev59.com/bXA65IYBdhLWcg3wogKe 例如。 - Davyd Geyl
请检查我的更新代码,并查看它在 [encoder encodeObject:categoryImage forKey:@"image"]; 这一行崩溃了。所以请帮我。 - Nikunj Jadav
无法对图像进行编码,只能对从UIImagePNGRepresentation()获取的数据进行编码。 - Davyd Geyl
非常感谢,我成功地对图像进行了编码,请检查我的更新代码,但应用程序崩溃了。出现了“[<NSCFString 0x75135b0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key name.”的错误,请帮助我解决。 - Nikunj Jadav
@NikunjR.Jadav:那是一个不同的问题。请为此提出一个新问题。 - Peter Hosey
您不应该使用以下这行代码:[NSKeyedArchiver archivedDataWithRootObject:imageData]; 您可以在UIImagePNGRepresentation之后保存数据。此外,设置对象后需要同步userDefaults。 - Lirik

8

在NSUserDefaults上保存图像:

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

在NSUserDefaults中检索图像:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接