2012-03-28 2 views
1

Приложение, над которым я работаю, позволяет пользователю выбрать изображение из своего рулона камеры и отобразить его в UIImageView. Теперь у меня возникают проблемы с сохранением данных. Я знаю, что я должен преобразовать изображение в PNG и сохранить данные, но у меня возникают некоторые проблемы. Я очень новичок в сохранении файлов и Objective-C в целом. Вот код, я использую:iOS: преобразование изображения в PNG для сохранения

- (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 ' ". Любая помощь очень ценится, спасибо!

ответ

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] 

Это единственное, что я вижу wo uld даст вам эту ошибку. Просто измените его на это и ошибка должна уйти:

- (void)applicationDidEnterBackground:(UIApplication*)application { 

НАЧАТЬ EDIT:

Насколько сохранить изображение, я не знаю точно, как вы храните данные, но вот как я это сделаю.

  1. Используйте сохраненное свойство для хранения данных изображения.

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; 

END EDIT

Надежда, что помогает.

+0

Удивительно, большое вам спасибо! – John

+1

Нет проблем. Рад помочь – David

+0

Изображение все равно не сохранится, знаете ли вы, как я должен редактировать код, чтобы сохранить его? Еще раз спасибо! – John

0

условии yourUIImage корректен и содержит данные, вы можете просто позвонить

[imageData writeToFile:(NSString*) atomically(BOOL)] 

Нет необходимости создавать массив и запись в него.

Смежные вопросы