我正在处理的应用程序允许用户从相机胶卷中选择一张图像,并将其显示在UIImageView中。现在,我在尝试保存数据时遇到了一些问题。我知道我必须将图像转换为PNG并保存数据,但我遇到了一些问题。我很擅长保存文件和Objective-C。这是我正在使用的代码:
- (NSString *)dataFilePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:kFilename9];
}
- (void)applicationDidEnterBackground:(NSNotification *)notification {
NSMutableArray *array = [[NSMutableArray alloc] init];
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image.image)];
[array addObject:imageData];
[array writeToFile:[self dataFilePath] atomically:YES];
}
- (void)viewDidLoad
{
self.imgPicker = [[UIImagePickerController alloc] init];
self.imgPicker.allowsImageEditing = YES;
self.imgPicker.delegate = self;
self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
image.image = [array objectAtIndex:0];
}
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidEnterBackground:)
name:UIApplicationDidEnterBackgroundNotification
object:app];
[super viewDidLoad];
}
程序崩溃时只需点击发生这种情况的选项卡。调试器声明“'NSInvalidArgumentException',原因:' - [__ NSCFData _isResizable]:无法识别的选择器发送到实例0x16cf50'”。非常感谢任何帮助,谢谢!
答案 0 :(得分:1)
好的,首先,你在第二次进入执行这些操作的“标签”时会收到此错误,是吗?所以错误应该在viewDidLoad方法中。其次,您的错误会调用选择器错误,因此请找到您使用@selector的位置。
以下是导致错误的问题:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidEnterBackground:)
name:UIApplicationDidEnterBackgroundNotification
object:app];
请注意,applicationDidEnterBackground方法有一个参数(NSNotification *):
- (void)applicationDidEnterBackground:(NSNotification *)notification {
然而你正在发送它的应用程序,这是一个UIApplication:
UIApplication *app = [UIApplication sharedApplication]
这是我能看到的唯一能给你这个错误的东西。只需将其更改为此错误就应该消失:
- (void)applicationDidEnterBackground:(UIApplication*)application {
开始编辑:
至于保存图像,我不确切知道你是如何存储数据的,但这就是我要做的。
<强> ViewController.h 强>
@interface ViewController
//Add this line
@property(retain) NSData* imageData;
@end
<强> ViewController.m 强>
//Remember to include this line somewhere in this file:
@synthesize imageData;
当您要保存文件时:
- (void)applicationDidEnterBackground:(UIApplication*)application {
self.imageData = [NSData dataWithData:UIImagePNGRepresentation(image.image)];
[self.imageData writeToFile:[self dataFilePath] atomically:YES];
}
这样就不会丢失数据,也不需要使用数组。只需确保在viewDidUnload方法中添加此行:
self.imageData = nil;
结束编辑
希望对你有所帮助。
答案 1 :(得分:0)
如果yourUIImage有效且包含数据,则可以调用
[imageData writeToFile:(NSString*) atomically(BOOL)]
无需创建数组并写入数据。