iOS: проблема сохранения фото - PullRequest
0 голосов
/ 31 марта 2012

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

- (NSString *)dataFilePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(
                                                         NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFilename9];
}

- (void)applicationDidEnterBackground:(UIApplication*)application {
    NSLog(@"Image on didenterbackground: %@", imageView);
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView2.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView3.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView4.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView5.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView6.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView7.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView8.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView9.image)];

    [self.imageData writeToFile:[self dataFilePath] atomically:YES];
    NSLog(@"The image is: %@", [[imageView image] description]);
    NSLog(@"dataFilePath is: %@", [self dataFilePath]);

}

- (void)viewDidLoad
{

    NSString *filePath = [self dataFilePath];
    NSLog(@"FilePath: %@", filePath);
    NSLog(@"Image: %@", imageView);
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        NSData *vdlData = [[NSData alloc] initWithContentsOfFile:filePath];
        imageView.image = [[UIImage alloc] initWithData:vdlData];
        imageView2.image = [[UIImage alloc] initWithData:vdlData];
        imageView3.image = [[UIImage alloc] initWithData:vdlData];
        imageView4.image = [[UIImage alloc] initWithData:vdlData];
        imageView5.image = [[UIImage alloc] initWithData:vdlData];
        imageView6.image = [[UIImage alloc] initWithData:vdlData];
        imageView7.image = [[UIImage alloc] initWithData:vdlData];
        imageView8.image = [[UIImage alloc] initWithData:vdlData];
        imageView9.image = [[UIImage alloc] initWithData:vdlData];
    }


    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(applicationDidEnterBackground:)
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:app];

    [super viewDidLoad];

}

Я пытаюсь выяснить, что мне нужно изменить, чтобы заставить UIImageViews отображать правильные изображения, а не все они отображают одно и то же изображение,Это, вероятно, простое исправление, но любая помощь будет принята с благодарностью, спасибо!

Ответы [ 3 ]

2 голосов
/ 31 марта 2012

Хорошо, вот как я бы это сделал:

Используйте NSUserDefaults для сохранения ваших изображений в виде изменяемого массива:

ViewController.h

@property(retain) NSUserDefaults *user;

ViewController.m

@synthesize user;

- (void)viewWillAppear:(BOOL)animated
{

    self.user = [NSUserDefaults standardUserDefaults];

Редактировать

    NSMutableArray* array = [[self.user objectForKey:@"images"]mutableCopy];
    while(array == nil)
    {
       [self.user setObject:[NSMutableArray arrayWithObject:@""] forKey:@"images"]
       array = [[self.user objectForKey:@"images"]mutableCopy];
       NSLog(@"%@",@"attempting to create an array to store the images in");
    }

Конец редактирования } ​​

- (void)applicationDidEnterBackground:(UIApplication*)application {
    NSLog(@"Image on didenterbackground: %@", imageView);
    NSMutableArray* array = [NSMutableArray arrayWithObject:[NSData dataWithData:UIImagePNGRepresentation(imageView.image)]];

    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView2.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView3.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView4.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView5.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView6.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView7.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView8.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView9.image)];

    [self.user setObject:array forKey:@"images"];

}

- (void)viewDidLoad
{
    NSMutableArray* array = [[self.user objectForKey:@"images"]mutableCopy];

EDIT

    if(array.count == 9)
    {
    imageView.image = [[UIImage alloc] initWithData:[array objectAtIndex:0]];
    imageView2.image = [[UIImage alloc] initWithData:[array objectAtIndex:1]];
    imageView3.image = [[UIImage alloc] initWithData:[array objectAtIndex:2]];
    imageView4.image = [[UIImage alloc] initWithData:[array objectAtIndex:3]];
    imageView5.image = [[UIImage alloc] initWithData:[array objectAtIndex:4]];
    imageView6.image = [[UIImage alloc] initWithData:[array objectAtIndex:5]];
    imageView7.image = [[UIImage alloc] initWithData:[array objectAtIndex:6]];
    imageView8.image = [[UIImage alloc] initWithData:[array objectAtIndex:7]];
    imageView9.image = [[UIImage alloc] initWithData:[array objectAtIndex:8]];
    }

END EDIT

    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(applicationDidEnterBackground:)
                                             name:UIApplicationDidEnterBackgroundNotification
                                           object:app];

    [super viewDidLoad];

}

- (void)viewDidUnload
{
    self.user = nil;
}

Таким образом, вы не потеряете изображения или данные,они будут сохранены и легко доступны, и они не исчезнут, даже если вы обновите свое приложение.

Приветствия!

2 голосов
/ 31 марта 2012

Прежде чем я начну с решения, я должен предупредить вас, что то, как вы это делаете, не является правильным.Я предлагаю вам начать изучение iOS с нуля.Собственная документация Apple - довольно хорошее начало.http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html

Теперь вернемся к вашему вопросу.Здесь вы сохраняете только одно изображение, а не все 9 из них.Вы устанавливаете self.imageData всегда для каждого обрабатываемого изображения и перезаписываете его предыдущее значение, делая только последнее изображение, которое будет сохранено в файл.

Таким образом, чтобы ваш код работал, вам придется использоватьimageData объект для каждого представления изображения, затем запишите этот объект данных в файл.

В вашем случае, вероятно, лучше оптимизировать код с помощью циклов, вместо этого используя несколько объектов (например, imageView, imageView2, ...).

Также позаботьтесь о своей памяти.например, imageView.image выделен, но не освобожден.

1 голос
/ 31 марта 2012

Ну, я вижу две проблемы.Прежде всего, в viewDidLoad все ваши изображения получают initWithData: vdlData ... поэтому они все получают одинаковые данные.Вот почему они все одинаковые.

Кроме того, когда вы пытаетесь сохранить их, в ...didEnterBackground вы перезаписываете значение imageData снова и снова ... при сохраненииэто просто последний, который вы назначили на imageData.Возможно, вы захотите создать NSArray и сохранить их там, вытаскивая их из массива в viewDidLoad.

...